如何从另一个控件中绑定到自定义控件按钮可见性

我有一个自定义控件,它有一个按钮:

 ... 

我想在另一个控件中包含此控件,但我想在主机控件中设置Load按钮的可见性; 就像是

  ...  <Views:FileSelectionControl />  ...  

其中显示我想要设置控件可见性的位置。 如何完成[不破坏MVVM模式]?

谢谢你的时间。

您可以在UserControl创建DependencyProperty

 public partial class SomeView : UserControl { ... public static DependencyProperty ButtonVisibilityProperty = DependencyProperty.Register("ButtonVisibility", typeof(Visibility), typeof(SomeView)); public Visibility ButtonVisibility { get { return (Visibility)GetValue(ButtonVisibilityProperty); } set { SetValue(ButtonVisibilityProperty, value); } } } 

将它绑定到Button.Visibility

    

然后您就可以从外部控制Visibility ,如下所示:

  

因为它是DependencyProperty你也可以使用Binding

您只需在UserControl1中创建一个bool或Visibility Type属性,并将其设置为Usercontrol2之类

UserControl1 xaml

     

xaml.cs

  public UserControl1() { InitializeComponent(); } bool showLoadButton; public bool ShowLoadButton { get { return showLoadButton; } set { showLoadButton = value; if (showLoadButton) Loadbutton.Visibility = Visibility.Visible; else Loadbutton.Visibility = Visibility.Collapsed; } } 

UserControl2设置ShowLoadButton True或false

     

如果您不想在UserControl定义属性,您可以始终创建附加的依赖项属性,并且可以在公共名称空间下的单独类中声明它。

像这样的东西:

MainWindow.xaml

  

TestUserControl.xaml

  

附属物定义:

 public static class ButtonExt { public static readonly DependencyProperty VisibilityProperty; public static void SetVisibility(DependencyObject DepObject, Visibility value) { DepObject.SetValue(VisibilityProperty, value); } public static Visibility GetVisibility(DependencyObject DepObject) { return (Visibility)DepObject.GetValue(VisibilityProperty); } static ButtonExt() { PropertyMetadata VisibiltyPropertyMetadata = new PropertyMetadata(Visibility.Collapsed); VisibilityProperty = DependencyProperty.RegisterAttached("Visibility", typeof(Visibility), typeof(ButtonExt), VisibiltyPropertyMetadata); } } 

Some notes about code-behind in MVVM

我同意@dkozl,他的例子并没有违反MVVM的原则,在某些情况下,代码存在于View ,例如(个人而言,我总是试图避免代码隐藏):

  • 安装DataContext

  • 使用不同的模式,如Mediator,Proxy等。

  • 确定仅与View相关的属性和行为(如您的情况)。

当您使用代码隐藏时最重要的是,通过ViewModel可能发生所有操作,即在ViewModel包含所有逻辑,例如,在View click事件中,调用ViewModel的函数。

有关代码隐藏的更多信息,请参阅最近问题的答案:

WPF MVVM代码背后