加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 无法在另一个Datagrid的RowDetailsTemplate内跟踪DataGrid

发布时间:2020-12-15 21:46:24 所属栏目:百科 来源:网络整理
导读:我今天早些时候遇到了这个问题,无法找到解决方案.当我在RowDetailsTemplate内部的DataGrid中选择一行时,不会设置另一个DataGrid的RowDetailsTemplate内的DataGrid的SelectedItem. (很难解释清楚.) 绑定都适用于列表. MainViewModel包含一个MyItem对象的Obser
我今天早些时候遇到了这个问题,无法找到解决方案.当我在RowDetailsTemplate内部的DataGrid中选择一行时,不会设置另一个DataGrid的RowDetailsTemplate内的DataGrid的SelectedItem. (很难解释清楚.)

绑定都适用于列表. MainViewModel包含一个MyItem对象的ObservableCollection,这是外部DataGrid绑定的内容.

MyItem对象包含一个MyItem2对象的ObservableCollection,它们被正确绑定到内部DataGrid.

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

顺便说一句:我正在使用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上试试这个

<DataTemplate DataType="{x:Type wpfApplication1:MyItem1}">
    <DataGrid AutoGenerateColumns="False" 
        ItemsSource="{Binding Item2s}" SelectedItem="{Binding Path=SelectedItem2,UpdateSourceTrigger=PropertyChanged}">

……
……
……

你需要updatesourcetrigger,我只是为你的一个绑定设置代码但是你需要在你计划使用propertychanged更新值的地方完成

我通常使用依赖项属性,因此您不需要这样做,但是对依赖项属性进行一些研究并且无法更改,您可以找到所需的属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读