2012-10-05 68 views
0

我想將自定義控件的依賴項屬性綁定到其ViewModel屬性。如何將自定義控件的依賴項屬性綁定到其視圖模型屬性

自定義控件的樣子:


public partial class MyCustomControl : Canvas 
    { 
      //Dependency Property 
      public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyCustomControl)); 


      private VisualCollection controls; 
      private TextBox textBox; 

      public string Text 
      { 
       get { return textBox.Text; } 
       set 
       { 
        SetValue(TextProperty, value); 
        textBox.Text = value; 
       } 
      } 

      //Constructor 
      public MyCustomControl() 
      { 
       controls = new VisualCollection(this); 
       InitializeComponent(); 

       textBox = new TextBox(); 
       textBox.ToolTip = "Start typing a value."; 

       controls.Add(textBox); 

       //Bind the property 
       this.SetBinding(TextProperty, new Binding("Text") {Mode = BindingMode.TwoWay, Source = DataContext}); 
      } 
    } 

和視圖模式是這樣的:


------- 

public class MyCustomControlViewModel: ObservableObject 
{ 
    private string _text; 


    public string Text 
    { 
     get { return _text; } 
     set { _text = value; RaisePropertyChanged("Text");} 
    } 
} 

---------- 

這約束力的 「文本」 屬性不工作因爲某些原因。

我想要做的是,在實際的實現中,我希望MyCustom控件的文本屬性更新,當我更新我的基礎ViewModel的文本屬性。

任何有關這方面的幫助,非常感謝。

+0

顯示您正在使用的xaml綁定。 –

+0

它似乎好像這應該工作,把一個斷點在文本 Setter –

+0

@eranotzer:我曾嘗試在文本設置器上放置一個斷點,但它從不觸及視圖中的setter,原因是屬性沒有綁定到底層viewmodels屬性。 – KSingh

回答

0

只需綁定到依賴屬性

<MyCustomControl Text="{Binding Path=Text}" /> 
+0

我想將數據上下文綁定到基礎視圖模型,然後我期望我的控件屬性綁定起作用。就像這樣:' – KSingh

0

您應該將文本框成員綁定到你的TextProperty代替。我非常肯定你的Text屬性在xaml中的綁定覆蓋了你在構造函數中的綁定。

1

經過一番研究,我終於找出了我的代碼問題。我通過創建一個靜態事件處理程序來實現此代碼,該處理程序實際將新屬性值設置爲依賴項屬性的基礎公共成員。依賴屬性的聲明是這樣的:

//Dependency Property 
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyCustomControl), new PropertyMetadata(null, OnTextChanged)); 

,然後定義設置的屬性是一樣的靜態方法:

private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    MyCustomControl myCustomControl = (MyCustomControl)d; 
    myCustomControl.Text = (string) e.NewValue; 
} 

這是我唯一缺少的東西。

Cheers

相關問題