C# 行选择更改时DataGridCell绑定值更新
我的问题是DataGrid仅在所选行发生更改时才发送用户通过GUI设置的新值。当我修改表单中的值并按“回车”确认输入时,一切正常(因为“回车”将选择移动到下一行)。但当我修改单元格中的值并用鼠标按当前行中的任何其他单元格时,新值将分配给单元格,但不会发送到绑定对象。在调试器中,我看到转换器的ConvertBack方法被调用,但Field.Value属性setter未被调用!值属性设置器断点仅在行选择更改后激发。如何在单元格编辑完成后强制更改模型对象值,而不是更改行选择 DataGrid的风格:C# 行选择更改时DataGridCell绑定值更新,c#,.net,wpf,datagrid,datagridcell,C#,.net,Wpf,Datagrid,Datagridcell,我的问题是DataGrid仅在所选行发生更改时才发送用户通过GUI设置的新值。当我修改表单中的值并按“回车”确认输入时,一切正常(因为“回车”将选择移动到下一行)。但当我修改单元格中的值并用鼠标按当前行中的任何其他单元格时,新值将分配给单元格,但不会发送到绑定对象。在调试器中,我看到转换器的ConvertBack方法被调用,但Field.Value属性setter未被调用!值属性设置器断点仅在行选择更改后激发。如何在单元格编辑完成后强制更改模型对象值,而不是更改行选择 DataGrid的风格:
<Style x:Key="ElementDataGridStyle" TargetType="DataGrid">
<Setter Property="AutoGenerateColumns" Value="False"/>
<Setter Property="HeadersVisibility" Value="Column"/>
<Setter Property="SelectionUnit" Value="Cell"/>
<Setter Property="CellStyle">
<Setter.Value>
<Style TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="IsReadOnly" Value="true">
<Setter Property="Background" Value="LightGray"/>
</Trigger>
</Style.Triggers>
<EventSetter Event="Loaded" Handler="ElementDataGridStyleCellStyle_Loaded"/>
</Style>
</Setter.Value>
</Setter>
</Style>
值转换器如下所示:
class FieldValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[1];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
object[] result = new object[2];
result[0] = Binding.DoNothing; //DependencyProperty.UnsetValue;
result[1] = value;
return result;
}
}
我可以问一下为什么不使用xaml来定义DataGrid绑定吗?在某些代码隐藏方法中甚至在ViewModel级别设置数据网格,这并不是真正的标准。@rejy11。字段是大小可变的集合。2.不应显示所有字段(条件“if(prop.VisualName!=null)”)。3.这段代码有点简化。在我的项目中,我还创建了不同类型的DataGribColumn,具体取决于内容的类型。如果您知道如何使用xaml,请告诉我。无论如何,我不认为我在哪里使用xaml或代码隐藏进行绑定很重要,还是我错了?据我所知,你可以在代码隐藏中完成你想做的一切,但WPF的一个主要卖点是使用xaml的能力。通过使用XAML,您更有可能从社区获得关于您的问题的帮助,因为没有多少人使用代码隐藏来构建他们的视图。您也可以使用自定义DataGridColumns,只需创建一个继承自DataGridColumn的类,然后在视图顶部创建一个XAML名称空间引用,然后使用CustomDataGridColumn,例如
@rejy11如果您有一个如何使用XAML完成现在在code behind中完成的任务的示例,请提供它。我有超过200名Core.Item类的成功者,这些数据应该显示在datagrid中(列数可变)。我不想在xaml中创建200个固定数据网格标记。也许我错过了什么。。。然而,这一切都是离谱的。
sealed class FieldCollection : ObservableCollection<Field>
public class Field : INotifyPropertyChanged
{
private string _value;
public string Value
{
get => _value;
set
{
if (_value != value)
{
Modify(value);
NotifyPropertyChanged();
}
}
}
private void Modify(string value)
{
_value = value;
}
protected void NotifyPropertyChanged([CallerMemberName]string propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
class FieldValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values[1];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
object[] result = new object[2];
result[0] = Binding.DoNothing; //DependencyProperty.UnsetValue;
result[1] = value;
return result;
}
}