2014-12-10 88 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」的布爾值。