我今天早些时候遇到了这个问题,但无法找到解决方案。当我在SelectedItem
内DataGrid
内选择一行时,RowDetailsTemplate
内的DataGrid
的{{1}}未设置DataGrid
}}。 (很难解释清楚。)
绑定都适用于列表。 MainViewModel包含RowDetailsTemplate
个ObservableCollection
个对象,这就是外部MyItem
绑定的对象。
DataGrid
对象包含MyItem
个ObservableCollection
个对象,它们被正确绑定到内部MyItem2
。
DataGrid
对象还有一个名为MyItem
的属性,该属性应绑定到内部SelectedItem2
的{{1}},但永远不会被设置。
BTW:我正在使用VS2012和.Net 4.5。
示例:
SelectedItem
DataGrid
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");
}
}
}
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:1)
啊,这很简单,你没有利用你的onpropertychanged
在你的datatemplate上试试这个
<DataTemplate DataType="{x:Type wpfApplication1:MyItem1}">
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding Item2s}" SelectedItem="{Binding Path=SelectedItem2,
UpdateSourceTrigger=PropertyChanged}">
...... ...... ......
你需要updatesourcetrigger,我只是为你的一个绑定提供代码但是你需要在你计划使用propertychanged来更新值的地方完成
我通常使用依赖项属性,所以你不需要这样做,但是对依赖项属性做了一些研究,并且在notifypropertychanged中你可以找到你想要的那个。