无法在另一个 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 包含一个 ObservableCollectionMyItem 对象,这就是外部 DataGrid 绑定的对象。

MyItem 对象包含 ObservableCollectionMyItem2 对象,它们正确绑定到内部 DataGrid

MyItem 对象还有一个名为SelectedItem2 的属性,它应该绑定到内部DataGridSelectedItem,但永远不会被设置。

顺便说一句:我使用的是 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() 内存泄漏

用嵌套List实现DataGrid的主从表显示

添加for循环时添加到datagrid的重复行

当我们单击 DataGrid 行时,在 wpf 功能区窗口中加载另一个用户控件

xaml 无法在 DataGrid 模板中垂直对齐文本

Datagrid 无法使用 Dataset 填充 - 输入字符串格式不正确