【发布时间】: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 的选定项吗?这个问题不清楚。请编辑您的问题
标签: c# wpf datagrid observablecollection rowdetailstemplate