WPF MVVM - 如何绑定自定义控件 - > ToggleButton.IsChecked to View-> TextBox.Text

时间:2014-12-10 21:37:18

标签: wpf mvvm textbox custom-controls togglebutton

我正在从WinForms转移到WPF并尝试为触摸屏应用程序实现MVVM模式。我在WPF控件库(dll)中创建了几个自定义控件,我可以将这些控件带入View中,没有任何问题。但是,我开始陷入纯粹的学术场景,我希望View中的TextBox能够显示我的自定义控件的ToggleButton.IsChecked属性为" Checked"和"未经检查"分别

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

1 个答案:

答案 0 :(得分: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代码段&#34; propdp&#34;。看起来应该是这样的:

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&#34; BoolToTextConverter&#34;将布尔值转换为字符串&#34; Checked&#34;或&#34;未经检查&#34;。