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