我有一个带有MainWindow的WPF应用程序。 MainWindow包含几个ObservableCollection类型的CLR属性。 MainWindow有一个datagrid,其ItemsSource属性绑定到一个可观察的集合(工作正常)。接下来,我有一个对话框。其目的是在数据网格中显示主窗口中的一个可观察集合。该对话框在MainWindow中实例化。最初我将ObservableCollection传递给对话框的构造函数,并将其复制到对话框的CLR属性中。然后我将对话框的DataContext设置为自身,并将datagrid中的ItemsSource属性绑定到CLR属性的名称。这很好。
有没有更好的方法来执行此操作而不是通过构造函数传递observable集合?我尝试使用GUI编辑器将对话框中的Datagrid的ItemsSource属性设置为MainWindow中的observable集合,GUI编辑器使用RelativeAncestor生成绑定,但数据未显示。问题是我有一堆对话框用于显示来自MainWindow的数据,我觉得应该有一个更简单的解决方案而不是将所有内容传递给对话框的构造函数。此外,对话框是否会被视为SubViews?主窗口是一个视图。
答案 0 :(得分:1)
假设您的Dialog
控件名为DialogControl
,并且其代码后面定义了DependencyProperty
Items
。在XAML中,我会将此属性绑定到DataGrid
,如下所示:
<DataGrid ItemsSource="{Binding Items, RelativeSource={RelativeSource Mode=
FindAncestor, AncestorType={x:Type DialogControl}}" />
此RelativeSource
绑定将关闭并搜索您的DialogControl
类的属性并找到Items
属性。注意:请勿将DataContext
的{{1}}设置为自身。
现在,在UserControl
文件中,您可以设置MainWindow.xaml.cs
属性:
DialogControl
更新&gt;&gt;&gt;
哦,我看到你现在的内容......你想要从Items
绑定到DialogControl dialogControl = new DialogControl();
dialogControl.Items = someCollection;
dialogControl.Show();
文件中的实际集合。您仍然可以按照我的建议进行操作,但您需要在UserControl
文件中添加MainWindow.xaml.cs
,而不是DependencyProperty
中的DialogControl
。在这种情况下,MainWindow.xaml.cs
中的绑定将是:
UserControl
为此,<DataGrid ItemsSource="{Binding Items, RelativeSource={RelativeSource Mode=
FindAncestor, AncestorType={x:Type MainWindow}}" />
属性必须为Items
。