WPF中ObservableCollection和DataGrid之间的双向绑定无法正常工作

3
我在我的应用程序中有一个简单的DataGrid。在源代码的某个地方,我将其ItemsSource属性绑定到一个ObservableCollection<System.Windows.Points>。因此,这些点会显示在DataGrid中。问题是,我已经设置了TwoWay绑定,但是当在DataGrid中更改点坐标值时,ObservableCollection中的实际点值并没有改变!发生了什么问题?
<DataGrid Name="pointList" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="X" Width="200">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=X, Mode=TwoWay}"></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Y" Width="200">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=Y, Mode=TwoWay}"></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
注意:我看过这个,但我的问题不同。

3
再说一遍:ObservableCollection 与其所持有的数据无关。System.Windows.Point 是一个结构体,不能用于此功能。请创建一个 ViewModel。 - Federico Berasategui
1个回答

1

System.Windows.Points 是一个结构体。你无法正确地绑定它的属性。

为什么?因为当你执行 Text="{Binding X, Mode=TwoWay}" 时,它会将 TextBoxText 属性绑定到当前 DataContextX 属性。

DataContext 是一个结构体 System.Windows.Points,那么数据绑定将修改的 Point 不是你分配给 DataContext 的那个。

要解决这个问题,请使用创建自己的 Point 类型:

public class Point : INotifyPropertyChanged
{
    private double x;
    public double X
    {
        get { return x; }
        set
        {
            if (x != value)
            {
                x = value;
                OnPropertyChanged("X");
            }
        }
    }
    private double y;
    public double Y
    {
        get { return y; }
        set
        {
            if (y != value)
            {
                y = value;
                OnPropertyChanged("Y");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

并且在绑定中使用 UpdateSourceTrigger=LostFocus

<TextBox Text="{Binding Path=Y, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"></TextBox>

我使用了这个类,但是没有任何变化!积分没有更新!我应该对我的DataGrid进行一些更改吗?在单元格编辑时应该使用哪个事件? - Hossein Narimani Rad
@HosseinNarimaniRad 现在,ItemsSource 已绑定到 _ObservableCollection<YourNamespace.Points>_,但仍然无法工作? - Cédric Bignon
这是代码:this.dataGrid.ItemsSource = this.points; points 是一个 ObservableCollection<MyNamespace.Points>,但它没有起作用。 - Hossein Narimani Rad
我尝试使用代码进行绑定,但它显示“双向绑定需要路径或XPath”。 - Hossein Narimani Rad
@HosseinNarimaniRad,我已经找到了问题。请看我的帖子末尾。 - Cédric Bignon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接