如何从另一个控件中绑定到自定义控件按钮可见性
我有一个自定义控件,它有一个按钮:
... ...
我想在另一个控件中包含此控件,但我想在主机控件中设置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代码背后