我遇到Datagrid SelectedValue和SelectedValuePath。
Datagrid定义如下:
<DataGrid x:Name="dataGridResources"
SelectionUnit="FullRow" AutoGenerateColumns="False"
SelectedValue="{Binding SelectedElement.Resource, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Resource">
<DataGrid.Columns>
<DataGridTextColumn Header="Tags" Binding="{Binding TagLine}"></DataGridTextColumn>
<DataGridTextColumn Header="Resource" Binding="{Binding Resource}"></DataGridTextColumn>
</DataGrid.Columns>
由于其他原因,Datagrid ItemsSource绑定到ViewModel(ElementsCVS.View)的属性,定义为CollectionViewSource,无论如何,这里是代码:
elements = new ObservableCollection<MElement>();
Elements = new ReadOnlyObservableCollection<Element>(elements);
ElementsCVS = new CollectionViewSource();
ElementsCVS.Source = Elements;
ElementsCVS.View.Filter += ResourcesCVS_Filter;
Element类是此接口的基本实现:
public interface IElement
{
string Name { get; set; }
CustomType Owner { get; set; }
int Order { get; set; }
OtherCustomType Type { get; set; }
string Resource { get; set; }
string TagLine { get; }
}
集合中的实际项目可以是任何子类型。 我想要实现的行为是,当我们更改datagrid中的选择时,其资源属性值将分配给SelectedElement.Resource。重要的注意事项是SelectedElement不是当前的数据网格选择,但是它绑定到不同的UI元素选择,我们需要保留所有其他属性。
此外,在运行时检查datagrid,其selectedvalue属性会相应地更新datagrid上的选择,但我找不到在SelectedElement的Resource属性上反映该更改的方法。
有什么想法吗?我哪里错了?
提前多多感谢。
修改
举个例子:
我们说我有以下的SelectedElement:
{ Name: Selected, Owner: SomeOwner, Order: 5, Type: 3,
Resource: "C:/Data/Res1.txt", TagLine: "Resource, C#, WPF" }
然后我在DataGrid中选择了以下项目:
{ Name: Resxyz, Owner: null, Order: -1, Type: 3,
Resource: "D:/Data/ResourceFile.txt", TagLine: "Resource, C++" }
此时我希望SelectedElement看起来像这样:
{ Name: Selected, Owner: SomeOwner, Order: 5, Type: 3,
Resource: "D:/Data/ResourceFile.txt", TagLine: "Resource, C#, WPF" }
所以唯一的行动应该是:
SelectedElement.Resource = "D:/Data/ResourceFile.txt";
答案 0 :(得分:0)
我弄清楚了,那是愚蠢的,我的坏。使用拼写错误的属性名称引发了SelectedElement属性的OnPropertyChanged事件。