私は今日早くこの問題に遭遇し、解決策を見つけることができません。の中にあるのSelectedItem
は、のDataGrid
中にある行を選択したときに設定されていません。(明確に説明するのは難しいです。)RowDetailsTemplate
DataGrid
DataGrid
RowDetailsTemplate
バインディングはすべてリストに対して正しく機能しています。MainViewModelにObservableCollection
はMyItem
オブジェクトが含まれており、これが外部DataGrid
バインド先です。
MyItem
オブジェクトにはオブジェクトが含まれておりObservableCollection
、それらMyItem2
は内部に正しくバインドされDataGrid
ます。
MyItem
オブジェクトには、内部のにSelectedItem2
バインドされることになっているが設定されないというプロパティもあります。SelectedItem
DataGrid
ところで:私はVS2012と.Net4.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));
}
}
どんな助けでもいただければ幸いです。
ありがとう!