【问题标题】:WPF MVVM - How to Bind Custom Control->ToggleButton.IsChecked to View->TextBox.TextWPF MVVM - 如何绑定自定义控件->ToggleButton.IsChecked 到 View->TextBox.Text
【发布时间】:2014-12-10 21:37:17
【问题描述】:

我正在从 WinForms 转移到 WPF 并尝试为触摸屏应用程序实现 MVVM 模式。我在 WPF 控件库 (dll) 中创建了几个自定义控件,我可以毫无问题地将这些控件带入视图。但是,我陷入了一个纯粹的学术场景,我希望 View 中的 TextBox 将我的自定义控件的 ToggleButton.IsChecked 属性分别显示为“Checked”和“Unchecked”。

总而言之,我需要知道在自定义用户控件中公开控件属性的正确方法。然后,当公开的属性更改时,使用基于更改的属性的自定义数据更新其他一些控件。

【问题讨论】:

  • 明确地说,您的 ToggleButton 是“自定义控件”还是“用户控件”?自定义控件通常从 Control 或现有控件(如 Button)继承;而用户控件将从 UserControl 继承。

标签: wpf mvvm textbox custom-controls togglebutton


【解决方案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”。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多