c# - 无法在另一个 Datagrid 的 RowDetailsTemplate 中跟踪 DataGrid 的 SelectedItem

标签 c# wpf datagrid observablecollection rowdetailstemplate

我今天早些时候遇到了这个问题,但找不到解决方案。 SelectedItemDataGridRowDetailsTemplate里面另一个DataGrid当我在 DataGrid 中选择一行时没有被设置在RowDetailsTemplate里面. (很难解释清楚。)

所有绑定(bind)都对列表正常工作。 MainViewModel 包含一个 ObservableCollectionMyItem对象,这就是外部 DataGrid绑定(bind)到。

MyItem对象包含 ObservableCollectionMyItem2对象并正确绑定(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/

相关文章:

.net - 实现 WPF MVVM 模式以关闭表单时获取 "DialogResult can be set only after Window is created and shown as dialog"

c# - 刷新 ListCollectionView 将 ComboBox 中所选项目的值设置为 null

c# - 如何使用c#在DataGrid(WPF)中显示列表列表

c# - 在 C# 中动态组合类

c# - 如何防止提交后清除输入的密码?

c# - 如何在C#中乘以矩阵?

WPF 数据网格 : How to clear selection programmatically?

c# - 不要在上下文菜单中将下划线视为 Alt

wpf - 将 WPF 控件设置为扩展以填充可用空间,仅此而已

c# - 是否存在内存泄漏?