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;
}
上面的示例中,两个DataGrid都绑定到同一个数据源,当在ComboBox中选择一个值,然后鼠标移开,另一个DataGrid的对应的之也更新了。
纳闷的是,模板列并没有制定为双向绑定,为什么就更新数据源了呢?
[解决办法]
WPF默认就是双向绑定。
[解决办法]
你指定绑定模式了吗?如果没指定那默认就是双向的
[解决办法]
是的,但这个接口只是数据属性引起的界面修改。反过来。界面修改去自动修改数据属性这是毫无花巧,是不需要这个接口的。个人见解。
[解决办法]
ObservableCollection已包括了INotifyPropertyChanged 接口
[解决办法]
datagrid1.ItemsSource = obc;
datagrid2.ItemsSource = obc;
两个同时绑定一个源哪有不同时更改的道理?
[解决办法]
这是官方的解释:http://msdn.microsoft.com/ZH-CN/library/ms594710(v=VS.110,d=hv.2).aspx
因此说WPF默认是双向绑定是错误的,默认是Default,但是,每个依赖项属性的默认值都不同。 一般情况下,用户可编辑控件属性(例如文本框和复选框的属性)默认为双向绑定,而多数其他属性默认为单向绑定。
在不确定默认值是什么绑定的情况下,好的习惯就是指定绑定Mode,经常使用的控件可以不必,因为你肯定清楚它的默认方式。
------解决方案--------------------
你实际测试下来是怎么样就是怎么样的,技术的东西不能单单靠想象,要测试验证。如果你不嫌麻烦,就用官方说的方法来检查:
确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。