如果我的方法有问题,请告诉我。 我有一个包含数据网格的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" />
答案 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
中移除新行。