Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 行选择更改时DataGridCell绑定值更新_C#_.net_Wpf_Datagrid_Datagridcell - Fatal编程技术网

C# 行选择更改时DataGridCell绑定值更新

C# 行选择更改时DataGridCell绑定值更新,c#,.net,wpf,datagrid,datagridcell,C#,.net,Wpf,Datagrid,Datagridcell,我的问题是DataGrid仅在所选行发生更改时才发送用户通过GUI设置的新值。当我修改表单中的值并按“回车”确认输入时,一切正常(因为“回车”将选择移动到下一行)。但当我修改单元格中的值并用鼠标按当前行中的任何其他单元格时,新值将分配给单元格,但不会发送到绑定对象。在调试器中,我看到转换器的ConvertBack方法被调用,但Field.Value属性setter未被调用!值属性设置器断点仅在行选择更改后激发。如何在单元格编辑完成后强制更改模型对象值,而不是更改行选择 DataGrid的风格:

我的问题是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;
    }
}