2010-06-16 82 views
4

我正在爲一個名爲SearchText的搜索文本編寫一個依賴屬性的用戶控件。它是一個依賴屬性,因爲我想讓控件的使用者使用數據綁定。用戶控件包含一個WPF文本框,用戶可以在其中輸入搜索文本。UserControl與自定義依賴屬性的問題

我可以使用數據綁定將用戶控件的SearchText依賴項屬性與TextBox的Text依賴項屬性連接起來,但僅當文本框丟失輸入焦點時纔會觸發此綁定。我想要的是每次更改文本後都要更新SearchText。 所以我添加了一個TextChanged事件處理程序到用戶控件,我將SearchText設置爲Text的值。

我的問題是,SearchText綁定不起作用,源永遠不會更新。我究竟做錯了什麼?

這裏的用戶控件代碼隱藏的相關部分:

public partial class UserControlSearchTextBox : UserControl 
{ 
    public string SearchText 
    { 
     get { return (string)GetValue(SearchTextProperty); } 
     set { SetValue(SearchTextProperty, value); } 
    } 

    public static readonly DependencyProperty SearchTextProperty = 
     DependencyProperty.Register("SearchText", typeof(string), typeof(UserControlSearchTextBox), new UIPropertyMetadata("")); 

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     SearchText = ((TextBox)sender).Text; 
    } 
    ... 
} 

包含用戶控件的實例都有它的DataContext設置爲有一個屬性也被稱爲SEARCHTEXT對象的窗口。

<uc:UserControlSearchTextBox SearchText="{Binding SearchText}" /> 

窗口的數據上下文:

public class DataSourceUserManual : DataSourceBase 
{ 
    private string _searchText; 
    public string SearchText 
    { 
     get { return _searchText; } 
     set 
     { 
      _searchText = value; 
      ... 
      OnPropertyChanged("SearchText"); 
     } 
    } 
} 

不幸的是,當我輸入在文本框中此setter不叫。 有什麼建議嗎?


以下後Quartermeisters暗示我已經刪除了TextBox_TextChanged事件處理程序,並安裝了一個結合這使TextBox.Text和UserControl.SearchText同步。

<TextBox Text="{Binding ElementName=root, 
         Path=SearchText, 
         UpdateSourceTrigger=PropertyChanged}" /> 

此綁定似乎工作。但是現在用戶控件和窗口的數據上下文之間的綁定被破壞(源不會被更新)。我已經改變了它一點點

<uc:UserControlSearchTextBox SearchText="{Binding Source={StaticResource ResourceKey=dataSource}, 
                Path=SearchText}" /> 

但沒有效果。

有什麼特別的我必須注意關於這些「鏈接」綁定?

回答

4

您可以強制文本框來更新綁定源通過引發LostFocus默認改變UpdateSourceTrigger到的PropertyChanged每次文字的變化:

<TextBox Text="{Binding SearchText, UpdateSourceTrigger=PropertyChanged}" /> 

參見Binding.UpdateSourceTrigger MSDN文章。


在您更新的問題上,它看起來像source屬性沒有更新,因爲您正在執行單向綁定。您可以做出的XAML結合雙向通過指定Mode

<uc:UserControlSearchTextBox SearchText="{Binding Source={StaticResource ResourceKey=dataSource}, 
               Mode=TwoWay, 
               Path=SearchText}" /> 

或者你可以在你的依賴屬性,它是什麼呢TextBox.Text指定FrameworkPropertyMetadataOptions.BindsTwoWayByDefault

public static readonly DependencyProperty SearchTextProperty = 
    DependencyProperty.Register("SearchText", typeof(string), typeof(UserControlSearchTextBox), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 
+0

謝謝你的提示! 但現在,我現在有兩個綁定有問題,請查看我更新的問題。 – 2010-06-16 14:45:01

+0

如果我將模式設置爲OneWayToSource,我的兩個綁定工作,所以現在所有問題都回答了。謝謝。 – 2010-06-17 06:59:59

+0

之前沒有注意到您更新的答案...現在我已經嘗試設置FrameworkPropertyMetadataOptions.BindsTwoWayByDefault並將兩種綁定都保留下來 - 並且它可以工作!再次感謝。 – 2010-06-17 07:18:06

0

您需要指定UIPropertyMetadata構造函數的PropertyChangedCallback參數。

This CodeProject article does not do what you want。請參閱如何使用Windows Vista Search API從WPF應用程序http://www.codeproject.com/KB/WPF/Vista_Search_in_WPF.aspx

... 
    new UIPropertyMetadata(
     default(string), 
     new PropertyChangedCallback(TextBox_TextChanged) 
    ) 
    ... 

    static void TextBox_TextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { 
     ... 
    } 
+0

謝謝您答案,但我認爲這不是我所需要的。也許你可以看看我更新的問題。 – 2010-06-16 14:52:02

+0

所有問題現在回答。謝謝。 – 2010-06-17 07:00:32