WPF MVVM - 如何绑定自定义控件->ToggleButton.IsChecked 到 View->TextBox.Text
Posted
技术标签:
【中文标题】WPF MVVM - 如何绑定自定义控件->ToggleButton.IsChecked 到 View->TextBox.Text【英文标题】:WPF MVVM - How to Bind Custom Control->ToggleButton.IsChecked to View->TextBox.Text 【发布时间】:2014-12-10 21:37:17 【问题描述】:我正在从 WinForms 转移到 WPF 并尝试为触摸屏应用程序实现 MVVM 模式。我在 WPF 控件库 (dll) 中创建了几个自定义控件,我可以毫无问题地将这些控件带入视图。但是,我陷入了一个纯粹的学术场景,我希望 View 中的 TextBox 将我的自定义控件的 ToggleButton.IsChecked 属性分别显示为“Checked”和“Unchecked”。
总而言之,我需要知道在自定义用户控件中公开控件属性的正确方法。然后,当公开的属性更改时,使用基于更改的属性的自定义数据更新其他一些控件。
【问题讨论】:
明确地说,您的 ToggleButton 是“自定义控件”还是“用户控件”?自定义控件通常从 Control 或现有控件(如 Button)继承;而用户控件将从 UserControl 继承。 【参考方案1】:总而言之,我需要知道在自定义用户控件中公开控件属性的正确方法。然后,当公开的属性更改时,使用基于更改的属性的自定义数据更新其他一些控件。
您正在描述dependency properties。您需要向自定义控件添加依赖属性,然后从控件内部和外部(在您的视图中)绑定到该属性。
第一部分取决于您使用的是UserControl
还是Control
。假设它是一个控件,那么您将在 ControlTemplate 中使用TemplatedParent
绑定:
<ToggleButton IsChecked="Binding RelativeSource=RelativeSource TemplatedParent,Path=IsToggleChecked,Mode=TwoWay" ... />
另一方面,如果它是UserControl
,则方法类似,但您需要确保数据上下文正确。一种方法是使用FindAncestor
绑定:
<ToggleButton IsChecked="Binding RelativeSource=RelativeSource AncestorType=UserControl,Path=IsToggleChecked,Mode=TwoWay" ... />
现在,要添加依赖属性,请尝试 Visual Studio 代码 sn-p "propdp"。它应该看起来像这样:
public bool IsToggleChecked
get return (bool)GetValue(IsToggleCheckedProperty);
set SetValue(IsToggleCheckedProperty, value);
public static readonly DependencyProperty IsToggleCheckedProperty =
DependencyProperty.Register("IsToggleChecked", typeof(bool), typeof(MyCustomControl), new PropertyMetadata(false));
现在终于可以将 TextBox 绑定到新的依赖属性了:
<TextBox Text="Binding ElementName=myCustomControl,Path=IsToggleChecked,Converter=StaticResource BoolToTextConverter" />
<local:MyCustomControl x:Name="myCustomControl" ... />
我假设您想要创建一个IValueConverter
“BoolToTextConverter”,将布尔值转换为字符串“Checked”或“Unchecked”。
【讨论】:
以上是关于WPF MVVM - 如何绑定自定义控件->ToggleButton.IsChecked 到 View->TextBox.Text的主要内容,如果未能解决你的问题,请参考以下文章
C# mvvmlight model数据非自己定义可以绑定吗