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; }
}

EDIT1

さらに調べてみると、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 に答える