无法在另一个 Datagrid 的 RowDetailsTemplate 中跟踪 DataGrid 的 SelectedItem
Posted
技术标签:
【中文标题】无法在另一个 Datagrid 的 RowDetailsTemplate 中跟踪 DataGrid 的 SelectedItem【英文标题】:Unable to track SelectedItem of DataGrid inside RowDetailsTemplate of another Datagrid 【发布时间】:2013-01-12 11:50:56 【问题描述】:我今天早些时候遇到了这个问题,但无法找到解决方案。当我在DataGrid
中选择位于RowDetailsTemplate
中的行时,未设置在另一个RowDetailsTemplate
中的DataGrid
中的SelectedItem
。 (很难解释清楚。)
列表的绑定都正常工作。 MainViewModel 包含一个 ObservableCollection
的 MyItem
对象,这就是外部 DataGrid
绑定的对象。
MyItem
对象包含 ObservableCollection
的 MyItem2
对象,它们正确绑定到内部 DataGrid
。
MyItem
对象还有一个名为SelectedItem2
的属性,它应该绑定到内部DataGrid
的SelectedItem
,但永远不会被设置。
顺便说一句:我使用的是 VS2012 和 .Net 4.5。
例子:
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication1="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<wpfApplication1:MainWindowViewModel x:Key="MainVm"/>
</Window.Resources>
<Grid DataContext="StaticResource MainVm">
<DataGrid AutoGenerateColumns="False" ItemsSource="Binding Path=MyItem1s">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Width="*"
Binding="Binding Path=Name"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid AutoGenerateColumns="False"
ItemsSource="Binding Path=Item2s"
SelectedItem="Binding Path=SelectedItem2">
<DataGrid.Columns>
<DataGridTextColumn Header="Item 2 Name" Width="130"
Binding="Binding Path=Name"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
MainWindowViewModel
public class MainWindowViewModel : ViewModelBase
public MainWindowViewModel()
for (int i = 0; i < 10; i++)
var item1 = new MyItem1();
item1.Name = i.ToString();
for (int j = 11; j < 20; j++)
item1.Item2s.Add(new MyItem2()
Name = j.ToString()
);
MyItem1s.Add(item1);
private ObservableCollection<MyItem1> _myItem1S = new ObservableCollection<MyItem1>();
public ObservableCollection<MyItem1> MyItem1s
get return _myItem1S;
set _myItem1S = value;
MyItems ViewModels
public class MyItem1 : ViewModelBase
private string _name;
public string Name
get return _name;
set
_name = value;
OnPropertyChanged("Name");
private ObservableCollection<MyItem2> _item2S = new ObservableCollection<MyItem2>();
public ObservableCollection<MyItem2> Item2s
get return _item2S;
set
_item2S = value;
OnPropertyChanged("Item2s");
private MyItem2 _selectedItem2;
public MyItem2 SelectedItem2
get return _selectedItem2;
set
_selectedItem2 = value;
OnPropertyChanged("SelectedItem2");
public class MyItem2 : ViewModelBase
private string _name;
public string Name
get return _name;
set
_name = value;
OnPropertyChanged("Name");
ViewModelBase
public class ViewModelBase : INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string property)
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
任何帮助将不胜感激。
谢谢!
【问题讨论】:
你到底想在这里做什么?您想在第二个 Datagrid 的 RowDetails 中显示第一个 Datagrid 的选定项吗?这个问题不清楚。请编辑您的问题 【参考方案1】:啊,这很简单,你没有利用你的 onpropertychanged
在你的数据模板上试试这个
<DataTemplate DataType="x:Type wpfApplication1:MyItem1">
<DataGrid AutoGenerateColumns="False"
ItemsSource="Binding Item2s" SelectedItem="Binding Path=SelectedItem2,
UpdateSourceTrigger=PropertyChanged">
…… …… ......
您需要 updatesourcetrigger,我只是为您的一个绑定提供代码,但无论您打算使用 propertychanged 更新值的任何地方,都需要这样做
我通常使用依赖属性,所以你不需要这样做,但是对依赖属性和 notifypropertychanged 做一些研究你可以找到你想要的。
【讨论】:
以上是关于无法在另一个 Datagrid 的 RowDetailsTemplate 中跟踪 DataGrid 的 SelectedItem的主要内容,如果未能解决你的问题,请参考以下文章
WPF DataGrid.items.Refresh() 内存泄漏