我今天早些时候遇到了这个问题,但找不到解决方案。 SelectedItem
的 DataGrid
在RowDetailsTemplate
里面另一个DataGrid
当我在 DataGrid
中选择一行时没有被设置在RowDetailsTemplate
里面. (很难解释清楚。)
所有绑定(bind)都对列表正常工作。 MainViewModel 包含一个 ObservableCollection
的 MyItem
对象,这就是外部 DataGrid
绑定(bind)到。
MyItem
对象包含 ObservableCollection
的 MyItem2
对象并正确绑定(bind)到内部 DataGrid
.
MyItem
object 还有一个名为 SelectedItem2
的属性这应该绑定(bind)到 SelectedItem
内部DataGrid
但永远不会设置。
顺便说一句:我使用的是 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));
}
}
任何帮助将不胜感激。
谢谢!
最佳答案
啊,这很简单,你没有利用你的 onpropertychanged
在你的数据模板上试试这个
<DataTemplate DataType="{x:Type wpfApplication1:MyItem1}">
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding Item2s}" SelectedItem="{Binding Path=SelectedItem2,
UpdateSourceTrigger=PropertyChanged}">
…… …… ……
你需要 updatesourcetrigger,我只是为你的一个绑定(bind)提供了代码,但无论你计划使用 propertychanged 更新值,都需要完成它
我通常使用依赖属性,所以你不需要这样做,但是对依赖属性和 notifypropertychanged 做一点研究你可以找到你想要的。
关于c# - 无法在另一个 Datagrid 的 RowDetailsTemplate 中跟踪 DataGrid 的 SelectedItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14573931/