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的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义 wpf 控件上绑定数据网格列的可见性?

WPF自定义控件与样式(14)-轻量MVVM模式实践

C# mvvmlight model数据非自己定义可以绑定吗

WPF随笔之 控件根据设定的显示行数列数填充控件并自适应窗体大小(多绑定MVVM方式实现)

WPF MVVM 网易云音乐

WPF MVVM 将用户控件绑定到主窗口视图模型