2011-09-19 53 views
1

我創建了一個包含依賴項屬性「文本」的自定義TextBox控件(但不是從TextBox派生的)。如何在TwoWay綁定中傳遞來自源的更改?

我已經添加了這個實例並將其綁定到我的視圖模型上的一個屬性使用TwoWay綁定。

從我的自定義TextBox控件中,如何以更改傳播到視圖模型屬性的方式更新Text屬性?

如果我在我的自定義控件上設置了「Text」屬性,則將離開視圖模型上的屬性的綁定替換爲null。

我還以爲這將是簡單的,但我看不出如何做到這一點(標準TextBox控件必須這樣做!)

乾杯

編輯:

自定義控件:

public class SampleCustomControl : CustomControl 
{ 
    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(SampleCustomControl), new PropertyMetadata(null)); 

    public void Update() 
    { 
     // This replaces my binding, I want it to pass the new value 
     // through to the "SomeProperty" two way binding. 
     Text = "some value"; 
    } 

} 

用法:

<Controls:SampleCustomControl Text="{Binding SomeProperty, Mode=TwoWay}" /> 
+2

所有DependencyProperty更新都通過SetValue在幕後觸發綁定上的更改事件。你通常會添加一個set/get對到你的DP(這只是爲你自己使用),它也調用GetValue/SetValue。你可以顯示你的XAML和代碼的控制和使用,因爲它應該是微不足道的。設置你的文本屬性不應該改變綁定。 –

+0

我正在設置一個Text屬性,它自己調用了SetValue方法,但是這正在替換綁定 - 我將添加一些代碼來演示它 –

回答

2

您需要在metadata of your dependency property中添加Property Changed回調。

當Text屬性更改時(從任一側),此回調將被觸發。您可以使用從中傳入的值來更新您構建的顯示文本的自定義UI。

更新: 迴應關於這是關於什麼的評論。由於您的示例代碼太模糊,無法測試,因此以下是我用來測試問題的內容。

public class TestControl : ContentControl 
{ 
    private TextBlock _tb; 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     _tb = new TextBlock(); 
     _tb.Text = Text; 
     this.Content = _tb; 
     _tb.MouseLeftButtonDown += new MouseButtonEventHandler(_tb_MouseLeftButtonDown); 
    } 

    void _tb_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Update(); 
    } 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(TestControl), new PropertyMetadata(string.Empty, OnTextChanged)); 

    public void Update() 
    { 
     // This replaces my binding, I want it to pass the new value 
     // through to the "SomeProperty" two way binding. 
     Text = "some value"; 
    } 

    public static void OnTextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     ((TestControl)sender).UpdateText((string)e.NewValue); 
    } 

    protected void UpdateText(string text) 
    { 
     if (_tb != null) _tb.Text = text; 
    } 
} 

然後,我使用雙向綁定將我的控件上的Text屬性綁定到視圖模型。當我單擊視圖中的文本時,視圖和視圖模型都將更新爲新文本「某些值」。如果我更新viewmodel中的值(並引發屬性更改的事件),則該值將在視圖和控件中更新,以便綁定仍然有效。

您的示例中必須存在一些其他缺失的部分。

+0

這個問題不是在綁定更改時更新我的​​自定義控件,而是更新自定義控件中的值通過綁定到視圖模型。 –

+0

剛剛更新了我的答案,以解決您的評論。 – Bryant

+0

*點擊桌面上的*你很對,缺少一些東西 - 在UserControl的XAML中,我將控件的DataContext設置爲RelativeSource = Self,這意味着Text DP上的TwoWay綁定正試圖綁定到控件本身而不是ViewModel上的一個屬性,但並不完全確定行爲是輝煌的,但我已經刪除了DataContext,給定了控件的根x和Name,並使用ElementName綁定綁定了UserControl中的控件,現在所有的作品。在將來我必須更加註意輸出窗口,這一切都很清楚! :) –

-1

只要您的綁定屬性設置爲TwoWay並且您已經暴露了getter和setter,那麼您在TextBox中輸入的文本就會發送到ViewModel。我相信,當你失去那個控制的焦點時,實際的發送會發生。

+0

我沒有使用實際的TextBox,我創建了一個自定義控件,我想支持TwoWay綁定。 –

相關問題