在拖曳模式下更新所选项目的样式

本文关键字:选项 项目 样式 更新 模式 | 更新日期: 2023-09-27 18:33:08

>我有一个视图,它有一个带有数据模板的列表视图我需要在所选项目上设置样式但是当所选项目从代码中更改时,我还需要修改视图中的选定项

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Text="{Binding Text, UpdateSourceTrigger=PropertyChanged}" Width="300" Height="50" TextAlignment="Center"/>
    <ListView Grid.Row="1" ItemsSource="{Binding List, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
        <ListView.ItemTemplate>
            <DataTemplate >
                <Border BorderThickness="1" BorderBrush="White">
                    <Grid Height="20" Width="30" >
                        <TextBlock  Text="{Binding Name}"/>
                    </Grid>
                </Border>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

有一个列表视图和文本块我需要当所选项目更改时,它更改了所选项目的背景

这是视图模型

 public class MainViewModel : ViewModelBase
{
    private Item selectedItem;
    public ObservableCollection<Item> List { get; set; }
     string text;
     public string Text
     {
         get { return text; }
         set
         {
             text = value;
             OnPropertyChanged("Text");
         }
     }
    public Item SelectedItem
    {
        get { return selectedItem; }
        set{
            if (value.Name != "Test1")
            {
                selectedItem = value;
                Text = value.Name;
            }
            else
            {
                Text = string.Format("Test1 was selected but the selected item is {0}", selectedItem==null?"null":selectedItem.Name);
            }
            OnPropertyChanged("SelectedItem");
        }
    }
    public  MainViewModel()
    {
        List = new ObservableCollection<Item>()
        {
            new Item("Test1","Val1"),new Item("Test2","Val2"),new Item("Test3","Val3"),new Item("Test4","Val"),
        };
        OnPropertyChanged("List");
    }
}
public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(params string[] propertyNames)
    {
        if (PropertyChanged != null)
        {
            foreach (var propertyName in propertyNames)
            {
                var e = new PropertyChangedEventArgs(propertyName);
                PropertyChanged(this, e);
            }
        }
    }
}
public class Item : ViewModelBase
{
    public string Name { get; set; }
    public string Value { get; set; }
    public Item(string name, string val)
    {
        Name = name;
        Value = val;
        OnPropertyChanged("Name");
    }
}

请注意,当选择"Test1 项目"时,所选项目未更改,但在视图中"Test1"被标记为已选中

在拖曳模式下更新所选项目的样式

在视图调用MainViewModel.SelectedItem资源库时,视图已经更新了其在列表中的选定项。绑定只是将这一事实通知 VM。您不设置MainViewModel.selectedItem这一事实对视图没有任何意义。

您可能会认为提高OnPropertyChanged("SelectedItem");会强制视图重新评估其所选项目,但实际上这不起作用。我认为这归结为 WPF 中的一些优化或防止循环绑定更新。(请记住,您的 setter 已作为绑定更新的一部分被调用,并且您正在尝试再次更新绑定)

如果希望阻止在视图中选择某些内容,则需要在视图中禁用它,然后再将其转到 VM。这是执行此操作的一种方法。