WPF Microsoft DataGrid的IsReadOnly属性出现异常行为,原因何在?
问题分析与解决思路
我来帮你捋捋这个问题哈——你遇到的这种多个DataGrid跟着ListView里的那个同步ReadOnly状态的情况,大概率是数据绑定上下文没做好隔离,或者资源/样式被意外复用导致的。
常见原因及对应解决办法:
- 绑定源共用同一个属性:如果所有DataGrid都绑定到ViewModel里的同一个
IsReadOnly属性,那肯定会同步变化呀!解决办法很简单,给不同容器里的DataGrid分配独立的绑定属性就行。比如给ListView里的DataGrid用ListViewDataGridIsReadOnly,ListBox里的用ListBoxDataGridIsReadOnly,单独的那个DataGrid用StandaloneDataGridIsReadOnly,这样切换复选框时就只会影响目标DataGrid了。 - 隐式样式的全局影响:要是你给DataGrid写了不带
x:Key的隐式样式,并且样式里的IsReadOnly绑定了全局的某个状态,那所有DataGrid都会自动应用这个样式,自然会跟着变。这时候可以给需要单独控制的DataGrid指定显式样式,或者在样式里用RelativeSource限定绑定范围,比如只绑定到当前ListView的DataContext,而不是全局的ViewModel。 - 元素名称绑定冲突:如果你的复选框绑定用了
ElementName,其他DataGrid的绑定不小心也引用了同一个元素名称,就会出现意外联动。这种情况建议改用RelativeSource或者直接绑定DataContext里的属性,避免元素名称带来的冲突问题。
给你个简单的修正示例参考:
先在ViewModel里拆分出独立的属性(记得实现INotifyPropertyChanged接口,不然属性变化不会同步到UI):
// ViewModel代码 public bool ListViewDataGridIsReadOnly { get; set; } public bool ListBoxDataGridIsReadOnly { get; set; } public bool StandaloneDataGridIsReadOnly { get; set; }
然后在XAML里分别绑定:
<!-- 单独的DataGrid --> <DataGrid IsReadOnly="{Binding StandaloneDataGridIsReadOnly}" ItemsSource="{Binding YourStandaloneData}" /> <!-- ListView内的DataGrid --> <ListView ItemsSource="{Binding YourListViewData}"> <ListView.ItemTemplate> <DataTemplate> <DataGrid IsReadOnly="{Binding DataContext.ListViewDataGridIsReadOnly, RelativeSource={RelativeSource AncestorType=ListView}}" ItemsSource="{Binding YourItemData}" /> </DataTemplate> </ListView.ItemTemplate> </ListView> <!-- ListBox内的DataGrid --> <ListBox ItemsSource="{Binding YourListBoxData}"> <ListBox.ItemTemplate> <DataTemplate> <DataGrid IsReadOnly="{Binding DataContext.ListBoxDataGridIsReadOnly, RelativeSource={RelativeSource AncestorType=ListBox}}" ItemsSource="{Binding YourItemData}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> <!-- 控制ListView内DataGrid的复选框 --> <CheckBox IsChecked="{Binding ListViewDataGridIsReadOnly}" Content="切换ListView内DataGrid只读状态" />
这样调整后,每个DataGrid的ReadOnly状态就可以各自独立控制,不会再出现互相影响的副作用啦。
内容的提问来源于stack exchange,提问作者Eric Ouellet
相关产品推荐
相关产品推荐

