限制ObservableCollection <t>

时间:2015-09-29 14:22:38

标签: c# wpf data-binding datagrid observablecollection

如果我的方法有问题,请告诉我。 我有一个包含数据网格的WPF窗口。这是为了让用户输入要处理的程序的对象ID列表。

我将DataGrid的ItemsSource绑定到ObservableCollection,其中MyObject是一个具有单个字符串属性的类 - ObjectId。

我有一个关于收集更改的事件:

 void TasksList_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            ProgressBarMax = TasksList.Count;
            TaskCountLabel = string.Format("{0} tasks to modify", TasksList.Count);
        }

我还要验证输入数据 - 用户可能提供不正确的ID,在这种情况下我不想将其添加到集合中。 但是,当我访问e.NewItems [0]对象时,其ObjectId属性仍为null,因此我无法验证。

我的做法出了什么问题?

根据评论添加datagrid XAML:

<DataGrid Margin="5,0,5,10"
                                         ColumnWidth="*"
                                         ItemsSource="{Binding ElementName=ThisUc,
                                                               Path=TasksList,
                                                               Mode=TwoWay,
                                                               UpdateSourceTrigger=PropertyChanged}"
                                         Style="{x:Null}"
                                         CanUserAddRows="True" CanUserPasteToNewRows="True"
                                         x:Name="TasksDataGrid"
                                         CanUserDeleteRows="True"
                                         VerticalAlignment="Stretch" HorizontalAlignment="Stretch"
                                         SelectionUnit="Cell" />

1 个答案:

答案 0 :(得分:1)

  

我还想验证输入数据

只需使用WPF验证功能。例如,基于IDataErrorInfo的验证:

public class RowViewModel : INotifyPropertyChanged, IDataErrorInfo
{
    // INPC implementation is omitted

    public string Id
    {
        get { return id; }
        set
        {
            if (id != value)
            {
                id = value;
                OnPropertyChanged();
            }
        }
    }
    private string id;

    public string this[string columnName]
    {
        get
        {
            if (string.IsNullOrEmpty(Id))
            {
                return "Id cannot be an empty string.";
            }

            return null;
        }
    }

    public string Error
    {
        get { return null; }
    }
}

    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Rows}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Id, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>
        </DataGrid.Columns>
    </DataGrid>
  

用户可能会提供不正确的ID,在这种情况下我不想这样做   将其添加到集合

你做不到。

DataGrid使用就地编辑时,添加新行会自动将新项目添加到绑定的ItemsSource中。但是,如果行数据源使用验证,则在出现验证错误之前,用户无法提交更改。

在这种情况下,用户有一种方法可以取消编辑,当他取消编辑时,DataGrid会从基础ItemsSource中移除新行。