c# - 如何检查模型列表中的重复条目?

标签 c# wpf mvvm

我有一个带有 ListView 的 MVVM 应用程序由 EditableTextblock 组成在 DataTemplate 中(like this)。

这是我的模型:

public class MyModel
{
    private string _data;
    public string Data
    {
        get { return _data; }
        set { _data = value; }
    }
}

我的 View 模型暴露了 ObservableCollectionMyModel :
public class MyViewModel
{
    [...]
    public ObservableCollection<Mymodel> models = new ObservableCollection<MyModel>();
}

并在绑定(bind)到 ListView 的 View 中:
<ListView ItemsSource={Binding models}>
    <!-- code removed for more visibility -->
    <DataTemplate>
         <controls:EditableTextblock Text="{Binding Data, Mode=TwoWay}" />
    </DataTemplate>
    <!-- ... -->
</ListView>

您是否有任何线索表明,当我在列表中的某个项目中更新数据成员的值时,会检查集合中是否已存在值?

例如,如果我将一个字段更新为“值 1”,它会检查模型集合中是否有一个成员 Data 已经具有该值。

如果它找到一个,它会在成员数据的末尾添加一个“0”。

最佳答案

前提是 MyModel类实现 INotifyPropertyChanged并提出 PropertyChanged Data 时的事件属性已设置,您可以在 View 模型中处理此问题:

public class MyViewModel
{
    public ObservableCollection<MyModel> models = new ObservableCollection<MyModel>();

    public MyViewModel()
    {
        models.CollectionChanged += Models_CollectionChanged;
    }

    private void Models_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (object model in e.NewItems)
            {
                (model as INotifyPropertyChanged).PropertyChanged
                    += new PropertyChangedEventHandler(Model_PropertyChanged);
            }
        }

        if (e.OldItems != null)
        {
            foreach (object model in e.OldItems)
            {
                (model as INotifyPropertyChanged).PropertyChanged
                    -= new PropertyChangedEventHandler(Model_PropertyChanged);
            }
        }
    }

    private void Model_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        MyModel updatedModel = sender as MyModel;
        MyModel duplicate = models.FirstOrDefault(x => x != updatedModel && x.Data == updatedModel.Data);
        if(duplicate != null)
        {
            updatedModel.Data += "0";
        }
    }
}
public class MyModel : INotifyPropertyChanged
{
    private string _data;
    public string Data
    {
        get { return _data; }
        set { _data = value; NotifyPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

关于c# - 如何检查模型列表中的重复条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46956227/

相关文章:

c# - HtmlTable 和 TagBuilder 的区别 ("table")

c# - 创建一个任务并以另一个任务的最高权限运行,

wpf - 触发器适用于 IsEnabled,但不适用于 CheckBox 中的 IsChecked

wpf - 在 WPF 中创建后/前图像 slider 控件

c# - View Model 的序列化和反序列化

c# - DateTime.ParseExact() 比 DateTime.Parse() 快吗

c# - 在 Unity3D UNET 服务器上使用 IPv6 连接问题

c# - 如何检查 HttpWebRequest 上传的进度?

c# - 在运行时创建未知类型的值

wpf - 使用 FSharp.ViewModule 关闭对话框