WPF,DataGrid数据绑定不是双向绑定也能更新?



<Grid>
    <DataGrid Name="datagrid1" Margin="123,146,553,42" AutoGenerateColumns="False" Height="131" Width="244">
        <DataGrid.Columns>
            <DataGridTextColumn Header="姓名" Width="105" Binding="{Binding Path=Name}" />
            <DataGridTextColumn Header="年龄" Binding="{Binding Path=Age}" />
            <DataGridComboBoxColumn x:Name="dataGridComboBoxColumn1"  SelectedItemBinding="{Binding Path=aaa}" Header="科目" />
        </DataGrid.Columns>
    </DataGrid>
    <Button Content="Button" HorizontalAlignment="Left" Margin="292,102,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    <DataGrid x:Name="datagrid2" Margin="429,146,247,42" AutoGenerateColumns="False" Height="131" Width="244">
        <DataGrid.Columns>
            <DataGridTextColumn Header="姓名" Width="105" Binding="{Binding Name}" />
            <DataGridTextColumn Header="年龄" Binding="{Binding Age}" />
            <DataGridComboBoxColumn x:Name="dataGridComboBoxColumn2"  SelectedItemBinding="{Binding aaa}" Header="科目" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>



private void Button_Click(object sender, RoutedEventArgs e)
{
    datagrid1.ColumnWidth = DataGridLength.Auto;
    ObservableCollection<Person> obc = new ObservableCollection<Person>();
    obc.Add(new Person() { Name = "张三", Age = 43, Address = "上海", aaa = "语文" });
    obc.Add(new Person() { Name = "李四", Age = 42, Address = "北京", aaa = "数学" });
    obc.Add(new Person() { Name = "王二女", Age = 50, Address = "美国", aaa = "化学" });
    datagrid1.ItemsSource = obc;
    datagrid2.ItemsSource = obc;
    List<string> list = new List<string>() { "语文", "数学", "化学", "物理" };
    dataGridComboBoxColumn1.ItemsSource = list;  
    dataGridComboBoxColumn2.ItemsSource = list; 
}



class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
    public string aaa { get; set; }
}




上面的示例中,两个DataGrid都绑定到同一个数据源,当在ComboBox中选择一个值,然后鼠标移开,另一个DataGrid的对应的之也更新了。
纳闷的是,模板列并没有制定为双向绑定,为什么就更新数据源了呢?

14 个解决方案

#1


#2


WPF默认就是双向绑定。

#3


你指定绑定模式了吗?如果没指定那默认就是双向的

#4


引用 2 楼 bwangel 的回复:
WPF默认就是双向绑定。

对什么默认是双向绑定的?对DataGridComboBoxColumn类型的列,还是对整个DataGrid呢?

#5


MSDN说的:
若要自动反映属性更改,源集合中的对象必须实现INotifyPropertyChanged 接口。 我这里的Person没有实现这个接口啊

#6


引用 5 楼 u012078625 的回复:
MSDN说的:
若要自动反映属性更改,源集合中的对象必须实现INotifyPropertyChanged 接口。 我这里的Person没有实现这个接口啊


是的,但这个接口只是数据属性引起的界面修改。反过来。界面修改去自动修改数据属性这是毫无花巧,是不需要这个接口的。个人见解。

#7


引用 6 楼 bwangel 的回复:
Quote: 引用 5 楼 u012078625 的回复:

MSDN说的:
若要自动反映属性更改,源集合中的对象必须实现INotifyPropertyChanged 接口。 我这里的Person没有实现这个接口啊


是的,但这个接口只是数据属性引起的界面修改。反过来。界面修改去自动修改数据属性这是毫无花巧,是不需要这个接口的。个人见解。

嗯,懂了。
不过:
整个DataGrid是默认的双向绑定吗?找了一上午,在MSDN没找到说这句话的地

#8


ObservableCollection已包括了INotifyPropertyChanged 接口

#9


引用 8 楼 DENQH 的回复:
ObservableCollection已包括了INotifyPropertyChanged 接口

已经完全迷糊了,好吧,上面例子,我不使用ObservableCollection,改成List,结果,仍然能更新,在其中一个DataGrid中修改数据,另一个DataGrid也更新了。为何?

#10


datagrid1.ItemsSource = obc;
    datagrid2.ItemsSource = obc;
两个同时绑定一个源哪有不同时更改的道理?

#11


引用 10 楼 DENQH 的回复:
datagrid1.ItemsSource = obc;
    datagrid2.ItemsSource = obc;
两个同时绑定一个源哪有不同时更改的道理?

没有理由?

#12


这是官方的解释: http://msdn.microsoft.com/ZH-CN/library/ms594710(v=VS.110,d=hv.2).aspx
因此说WPF默认是双向绑定是错误的,默认是Default,但是,每个依赖项属性的默认值都不同。 一般情况下,用户可编辑控件属性(例如文本框和复选框的属性)默认为双向绑定,而多数其他属性默认为单向绑定。 

在不确定默认值是什么绑定的情况下,好的习惯就是指定绑定Mode,经常使用的控件可以不必,因为你肯定清楚它的默认方式。

#13


引用 12 楼 qldsrx 的回复:

我示例中的ComboBox应该默认不是双向绑定的吧,

#14


你实际测试下来是怎么样就是怎么样的,技术的东西不能单单靠想象,要测试验证。如果你不嫌麻烦,就用官方说的方法来检查:
确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2019 ITdaan.com

赞助商广告