0

出于某种原因,当我更新 DataGrid 中的值时,它们不会保留在内存对象中吗?实际上,在编辑单元格期间会显示新值,但是一旦我切换到下一行,这些值就会恢复。

这是我的 DataGrid 定义:

<DataGrid ItemsSource="{Binding Items, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Position X" Binding="{Binding Position.X, Mode=TwoWay}"/>
        <DataGridTextColumn Header="Position Y" Binding="{Binding Position.Y, Mode=TwoWay}"/>
        <DataGridTextColumn Header="Position Z" Binding="{Binding Position.Z, Mode=TwoWay}"/>
        <DataGridTextColumn Header="Rotation" Binding="{Binding Angles[2], Mode=TwoWay}"/>
    </DataGrid.Columns>
</DataGrid>

对象是:

public class Box{
  public Vector3D Position { get; set; }
  public double[] Angles { get; set; }
}

编辑1

经过进一步检查,我注意到Vector3D(of System.Windows.Media.Media3D) 是一个结构,而不是一个类。因此,我怀疑间接的Position.X不起作用。

话虽如此,当我删除了除“旋转”绑定之外的所有内容时double[],它仍然无法正常工作。

EDIT2: 绑定报告绑定正在停用分离的诊断。

4

1 回答 1

0

我设法通过创建一个值转换器将你绑定Vector3D到:DataGridTextColumn

public class StringToStructConverter : IValueConverter
{
    private Vector3D vector3D = new Vector3D();

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        vector3D = (Vector3D)value;
        if (parameter.ToString() == "X") return vector3D.X.ToString();
        else if (parameter.ToString() == "Y") return vector3D.Y.ToString();
        else if (parameter.ToString() == "Z") return vector3D.Z.ToString();
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || value.GetType() != typeof(string) || targetType != typeof(Vector3D)) return false;

        if (parameter.ToString() == "X") vector3D.X = double.Parse(value.ToString());
        else if (parameter.ToString() == "Y") vector3D.Y = double.Parse(value.ToString());
        else if (parameter.ToString() == "Z") vector3D.Z = double.Parse(value.ToString());
        return vector3D;
    }
}

<DataGrid ItemsSource="{Binding DataContext.Items, Mode=TwoWay, ElementName=This}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Position X" Binding="{Binding Position, 
Converter={StaticResource StringToStructConverter}, ConverterParameter=X, Mode=TwoWay}"/>
        <DataGridTextColumn Header="Position Y" Binding="{Binding Position, 
Converter={StaticResource StringToStructConverter}, ConverterParameter=Y, Mode=TwoWay}"/>
        <DataGridTextColumn Header="Position Z" Binding="{Binding Position, 
Converter={StaticResource StringToStructConverter}, ConverterParameter=Z, Mode=TwoWay}"/>
        <DataGridTextColumn Header="Rotation" Binding="{Binding Angles[2], Mode=TwoWay}"/>
    </DataGrid.Columns>
</DataGrid>

Vector3D但是,这种方法并不完美,如果将结构更改为具有相同属性的类,则可以为自己省去一大堆麻烦。您甚至可以保留您的结构(我猜您首先有选择它的理由),但只需将其转换为一个类只是为了在其中编辑它,DataGrid然后再转换回来?这可以在几毫秒内完成,但可以为您节省数小时的头痛。:)

于 2013-07-23T12:44:33.447 回答