WPF - 为什么我的绑定行为不是双向的?

时间:2017-11-03 17:24:00

标签: c# wpf xaml data-binding datagrid

我一直在努力解决与WPF的数据绑定并接收对ObservableCollection的数据网格所做的编辑。

我创建了一个datagrid,旨在允许用户只编辑一个点(X和Y)的现有值,ObservableCollection将它们称为 coordinates

网格成功填充了坐标中的任何数据。但是,每当我更改数据网格中的X或Y值时(由于某种原因,似乎有X和Y的重复列),它不会在坐标中更新(当我使用控制台时显示)。为什么会这样?

以下是XAML代码:

            <DataGrid x:Name="XYDataGrid" 
                    CanUserSortColumns="False" 
                    CanUserReorderColumns="False"
                    CanUserResizeColumns="False"
                    CanUserResizeRows="False"
                    ColumnWidth="*"
                    ItemsSource="{Binding}"
                    LostFocus="XYDataGrid_LostFocus">
            <DataGrid.Columns>
                <DataGridTextColumn Header="X" Binding="{Binding X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                <DataGridTextColumn Header="Y" Binding="{Binding Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </DataGrid.Columns>
        </DataGrid>

在我的C#中:

    private ObservableCollection<Point> coordinates = new ObservableCollection<Point>();

    public MainWindow()
    {
        InitializeComponent();

        coordinates.Add(new Point()
        {
            X = 1,
            Y = 1
        });

        this.DataContext = coordinates;            
    }

    private void XYDataGrid_LostFocus(object sender, RoutedEventArgs e)
    {
        Console.WriteLine((coordinates[0].X).ToString());

    }

1 个答案:

答案 0 :(得分:0)

就像@Clemens指出的那样,Point是一个 结构,它是值类型而非引用类型。请使用类,例如:

public class CustomPoint
{
    public double X { get; set; }
    public double Y { get; set; }   
}

然后将集合更改为:

private ObservableCollection<CustomPoint> coordinates = new ObservableCollection<CustomPoint>();

要摆脱重复列,请通过设置AutoGenerateColumns =“False”来关注@Bradley Uffner建议:

<DataGrid x:Name="XYDataGrid" 
                    CanUserSortColumns="False" 
                    CanUserReorderColumns="False"
                    CanUserResizeColumns="False"
                    CanUserResizeRows="False"
                    ColumnWidth="*"
                    ItemsSource="{Binding}"
                    AutoGenerateColumns="False"
                    LostFocus="XYDataGrid_LostFocus">
            <DataGrid.Columns>
                <DataGridTextColumn Header="X" Binding="{Binding X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                <DataGridTextColumn Header="Y" Binding="{Binding Y, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </DataGrid.Columns>
        </DataGrid>