C# WPF-为什么不';我的约束行为不是双向的吗?

C# WPF-为什么不';我的约束行为不是双向的吗?,c#,wpf,xaml,data-binding,datagrid,C#,Wpf,Xaml,Data Binding,Datagrid,我一直在努力了解WPF的数据绑定,并接收对datagrid进行的编辑,以实现可观察的收集 我制作了一个datagrid,它只允许用户编辑一个点(X和Y)的现有值,其中包含一个称为坐标的ObservableCollection 网格成功地填充了坐标中的任何数据。但是,每当我更改数据网格中的X或Y值时(出于某种原因,似乎有一个重复的X和Y列),它不会在坐标中更新(在使用控制台时显示)。为什么会这样 以下是XAML代码: <DataGrid x:Name="XYDataG

我一直在努力了解WPF的数据绑定,并接收对datagrid进行的编辑,以实现可观察的收集

我制作了一个datagrid,它只允许用户编辑一个点(X和Y)的现有值,其中包含一个称为坐标的ObservableCollection

网格成功地填充了坐标中的任何数据。但是,每当我更改数据网格中的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>

在我的简历中:

    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());

    }
私有ObservableCollection坐标=新ObservableCollection();
公共主窗口()
{
初始化组件();
坐标。添加(新点()
{
X=1,
Y=1
});
this.DataContext=坐标;
}
私有void XYDataGrid_LostFocus(对象发送方,路由目标)
{
Console.WriteLine((坐标[0].X).ToString());
}

正如@Clemens所指出的,这一点是 Struct,它是值类型而不是引用类型。改为使用类,例如:

public class CustomPoint
{
    public double X { get; set; }
    public double Y { get; set; }   
}
然后将集合更改为:

private ObservableCollection<CustomPoint> coordinates = new ObservableCollection<CustomPoint>();
私有ObservableCollection坐标=新ObservableCollection();
要消除重复列,请按照@Bradley Uffner的建议设置AutoGenerateColumns=“False”:



AutoGenerateColumns=“False”
添加到
DataGrid
中,以除去额外的列。默认情况下,网格将根据在
DataContext
上找到的属性为您创建列。点是一个结构,因此不是一个。如果没有,您应该实现INotifyPropertyChanged接口
<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>