如果ListView被绑定到ReadOnlyObservableCollection,如何在属性更改时验证ListViewItem的属性?

时间:2018-01-27 04:15:20

标签: c# wpf xaml listview

我有以下VM类:

public class SubModuleVM:INotifyPropertyChanged
{
       public event PropertyChangedEventHandler PropertyChanged;
       public string _name;
        public string Name
        {
            get { return_name; }
            set {
            _name = value; 
             PropertyChanged?.(this, new PropertyChangedEventArgs(nameof(Name)));
           }
        }
}


public class ProjectViewVM:INotifyPropertyChanged
{
   public ReadOnlyObservableCollection<SubModuleVM> SubModules
   {get;set;}
   public ProjectViewVM()
   {
           SubModules=LoadFromDatabase();  //loads from database
   }
   // snip irrelevant details
}

与ProjectViewVM对应的XAML类:

  <ListView ItemsSource="{Binding SubModules}" SelectedItem="{Binding CurrentModule}" SelectionMode="Single">

        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>


                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="150" />
                    </Grid.ColumnDefinitions>
                    <TextBox Text="{Binding Name}" Grid.Column="0" Margin="0,0,5,0"/>                                                 
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

请注意,Collection是ReadOnlyObservableCollection,不确定是否会导致绑定问题

当用户更改了用户界面Name中的ListView时,我想进行验证,以便SubModuleVM.Name内的所有ProjectViewVM都是唯一的。换句话说,我不允许SubModuleVM.Name集合中的SubModules重复。如果用户将其重命名为已存在的值,那么我希望激活验证事件(在UI级别)并通知用户这是不允许的,然后该名称将恢复为旧名称。

我认为ListView应该有这样的验证事件可用于捕获,但到目前为止我找不到任何。

如何实施我的要求?

1 个答案:

答案 0 :(得分:-1)

如果你在上面提到的列表视图中更新或编辑名称时调用了Name属性上的set,请尝试调用类似于以下代码段的逻辑:

id