如何在单独的目录中设置绑定到用户控件

时间:2010-06-04 19:30:50

标签: wpf wpf-controls binding

到目前为止,当控件和其他对象位于同一目录或同一个xaml文档中时,我已经创建并设置了它们之间的绑定和依赖关系。

现在我创建了一个usercontrol,它位于我的项目名为“Controls”的目录中,然后使用标记

将该控件加载到主xaml文档中

我的问题是如何设置用户控件中的对象与主xaml文档中的对象之间的绑定。

这方面的一个例子是,如果我的用户控件中有一个文本框,并且在主xaml页面中有一个复选框。单击复选框时,我想将文本框的可见性设置为Collapsed。

正如我所说,当两个对象都在同一个文档中时,我能够做到这一点但是现在由于文本字段放在用户控件内并且在目录中,我不确定如何引用它。

谢谢

1 个答案:

答案 0 :(得分:0)

将DependencyProperty添加到UserControl。在主窗口的XAML中,绑定到DependencyProperty。在UserControl的XAML中,使用RelativeSource FindAncestor绑定到相同的DependencyProperty。

例如,如果您的UserControl被称为“MyUserControl”并且具有DependencyProperty“ShowDetails”,则主XAML中的绑定将是:

<Window ...>
  ...
  <local:MyUserControl ShowDetails="{Binding IsChecked,ElementName=checkBox}" />
  ...
  <CheckBox x:Name=checkBox Content="Show Details" />
  ...
</Window>

并且在UserControl的XAML中它将是:

<UserControl ...>
  ...
  <Textbox ...
     Visibility="{Binding ShowDetails,
       RelativeSource={RelativeSource FindAncestor,local:MyUserControl,1},
       Converter={StaticResource BoolToVisibiltyConverter}" />
  ...
</UserControl>

更好的是,使用MVVM模式。在这种情况下,您可以将DependencyProperty放在ViewModel中,该ViewModel可以通过主窗口和UserControl的DataContext访问。使用MVVM,不需要使用FindAncestor或ElementName,因为CheckBox和TextBox都直接绑定到ViewModel中的属性:

<Window ...>

  <local:MyUserControl />
  ...
  <CheckBox IsChecked="{Binding ShowDetails}" Content="Show Details" />

</Window>

使用此UserControl:

<UserControl>
  ...
  <TextBox ...
     Visibility="{Binding ShowDetails,
       Converter={StaticResource BoolToVisibiltyConverter}" />
  ...
</UserControl>