2014-12-10 92 views
0

我正在从WinForms转移到WPF,并试图为触摸屏应用程序实现MVVM模式。我在WPF控件库(dll)中创建了多个自定义控件,并且我可以将这些控件放入View中而不会造成任何问题。然而,我陷入了纯学术式的场景,我希望View中的TextBox分别显示我的自定义控件的ToggleButton.IsChecked属性为“Checked”和“Unchecked”。WPF MVVM - 如何绑定自定义控件 - > ToggleButton.IsChecked查看 - > TextBox.Text

总结一下,我需要知道正确的方法来暴露自定义用户控件中的控件属性。然后,当暴露的属性更改基于更改的属性更新其他控件与自定义数据。

+1

需要说明的是,您的ToggleButton是“自定义控件”还是“用户控件”?自定义控件通常会继承自Control或现有的控件,如Button;而用户控件将从UserControl继承。 – olitee 2014-12-10 21:50:52

回答

1

总结一下,我需要知道正确的方法来暴露自定义用户控件中的控件的属性。然后,当暴露的属性更改基于更改的属性更新其他控件与自定义数据。

您正在描述dependency properties。您需要为您的自定义控件添加一个依赖项属性,然后从控件内部和从外部(在您的视图中)绑定该属性。

第一部分将取决于您是否使用UserControlControl。比方说,它是一个控制,那么你可以使用一个TemplatedParent在您的ControlTemplate结合:

<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代码片段“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 Text="{Binding ElementName=myCustomControl,Path=IsToggleChecked,Converter={StaticResource BoolToTextConverter}}" /> 
<local:MyCustomControl x:Name="myCustomControl" ... /> 

我以为你会想打一个IValueConverter,其将“BoolToTextConverter”字符串“Checked”或“Unchecked”的布尔值。