更新的值未反映在WPF中的UI中

我正在尝试在ListView中动态填充和导航面板

<ListView Background="Transparent" HorizontalAlignment="Center" x:Name="viewItemControl" ItemsSource="{Binding Views}">
        <ListView.ItemsPanel>
            <itemspaneltemplate>
                <StackPanel/>
            </itemspaneltemplate>
        </ListView.ItemsPanel>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Button Style="{StaticResource PluginViewButton}" 
                        Command="{Binding ElementName=viewItemControl,Path=DataContext.NavigateCommand}" 
                        commandparameter="{Binding ViewName}" 
                        BorderThickness="{Binding Path = ViewObj.DataContext.IsSelected,Converter={StaticResource BoolToThicknessConverter},Mode=OneWay}">
                    <Button.Content>
                        <Grid Background="White">
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition Height="15"/>
                            </Grid.RowDefinitions>
                            <Image Grid.Row="0" Source="{Binding Icon,Mode=OneTime}"></Image>
                            <TextBlock Grid.Row="1" Text="{Binding DisplayableName}" HorizontalAlignment="Center"/>
                        </Grid>
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Focusable" Value="false"/>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

列表视图已绑定到ViewInfo对象的集合

public class ViewInfo
{
    public ViewInfo(IPluggableView view)
    {
        ViewName = view.ViewName;
        DisplayableName = view.DisplayableName;
        DisplayRank = view.DisplayRank;
        Icon = view.Icon;
        ViewModelType = view.ViewModelType;
        ViewObj = view;
    }
    public IPluggableView ViewObj { get; set; }
    public string ViewName { get; set; }
    public string DisplayableName { get; set; }
    public Type ViewModelType { get;set; }
    public int DisplayRank { get; set; }
    public BitmapSource Icon { get; set; }
}

接口IPluggableView由我所有的视图用户控件实现

我的viewmodel基类具有属性 IsSelected 。 Viewmodel类正在实现棱镜 INavigationAware 接口,因此在OnNavigatedTo和OnNavigatedFrom函数中,我正在更新IsSelected属性。

我希望在选择视图时我的按钮边框变粗,当我导航到下面给出的另一个视图时,它应该恢复为默认设置。

更新的值未反映在WPF中的UI中

所以我写了BoolToThickness转换器,根据值简单地返回0.5或2。

我面临的问题是,即使在我更新IsSelected属性时,它在加载时仅更新一次,之后再也没有更新。

我肯定UI不会收到RaisePropertyChanged事件。但是我知道可以解决这个问题。 如果这是一个设计问题,请帮助我进行纠正。

peeky1 回答:更新的值未反映在WPF中的UI中

您应该定义ItemContainerStyle并直接在IsSelected上触发。仅当您想要修改或删除默认突出显示行为时,才需要覆盖ControlTemplate

<ListView.ItemContainerStyle>
  <Style TargetType="ListViewItem">
    <Setter Property="BorderThickness"
            Value="1" />
    <Setter Property="BorderBrush"
            Value="Black" />

    <!-- Optional -->
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="ListViewItem">
          <Border Background="{TemplateBinding Background}" 
                  BorderBrush="{TemplateBinding BorderBrush}"
                  BorderThickness="{TemplateBinding BorderThickness}" 
                  Padding="{TemplateBinding Padding}">
            <ContentPresenter />
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>

    <!-- Change border thickness on item is selected -->
    <Style.Triggers>
      <Trigger Property="IsSelected" Value="True">
        <Setter Property="BorderThickness" Value="3" />
      </Trigger>
    </Style.Triggers>
  </Style>
</ListView.ItemContainerStyle>

此外,您还应该将ListView.SelectedItem绑定到视图模型以控制当前选择。

但是,如果您仍然想使用值转换程序,则应该调整BorderThickness上的绑定:

<Button BorderThickness="{Binding RelativeSource="{RelativeSource FindAncestor,AncestorType=ListViewItem},Path=IsSelected,Converter={StaticResource BoolToThicknessConverter}}">
本文链接:https://www.f2er.com/3133965.html

大家都在问