2010-06-16 4 views
4

SearchText라는 검색 텍스트에 대한 종속성 속성이있는 사용자 정의 컨트롤을 작성하고 있습니다. 컨트롤의 소비자가 데이터 바인딩을 사용하도록 허용하기 때문에 종속성 속성입니다. 사용자 정의 컨트롤에는 사용자가 검색 텍스트를 입력 할 수있는 WPF TextBox가 있습니다.사용자 지정 종속성 속성이있는 UserControl의 문제

데이터 바인딩을 사용하여 TextBox의 Text 종속성 속성을 사용하여 사용자 정의 컨트롤의 SearchText 종속성 속성을 연결할 수 있지만 텍스트 바인딩이 입력 포커스를 잃을 때만이 바인딩이 실행됩니다. 내가 원하는 것은 SearchText를 매번 텍스트를 변경 한 후에 업데이트하는 것입니다. 그래서 SearchText를 Text 값으로 설정 한 사용자 정의 컨트롤에 TextChanged 이벤트 처리기를 추가했습니다.

내 문제는 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는 검색 텍스트라는 속성을 가진 개체로 설정 한 사용자 컨트롤의 인스턴스를 포함하는 창.

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

윈도우의 데이터 컨텍스트 : 나는 텍스트 상자에 입력 할 때

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

불행하게도,이 세터가 호출되지 않습니다. 아이디어가 있으십니까? 다음 후


는 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의 기본값하여 PropertyChanged에 UpdateSourceTrigger을 변경하여 때마다 텍스트 변경 내용을 업데이트 할 텍스트 상자를 강제 할 수

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

Binding.UpdateSourceTrigger에 MSDN 문서를 참조하십시오.


업데이트 된 질문에 단방향 바인딩을 수행 중이므로 원본 속성이 업데이트되지 않는 것 같습니다. 당신은 지정하여 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

그 힌트를 가져 주셔서 감사합니다! 하지만 지금 제가 가지고있는 두 가지 바인딩에 문제가 있습니다. 업데이트 된 질문을 참조하십시오. –

+0

모드를 OneWayToSource로 설정하면 두 바인딩이 작동하므로 모든 질문에 지금 답변이 제공됩니다. 감사. –

+0

이전에 업데이트 된 답변을 발견하지 못했습니다 ... 이제 FrameworkPropertyMetadataOptions.BindsTwoWayByDefault를 설정하고 두 바인딩을 두 가지 방법으로 남겨 뒀습니다. 다시 한번 감사드립니다. –

0

UIPropertyMetadata 생성자에 대해 PropertyChangedCallback 매개 변수를 지정해야합니다.

이 CodeProject 기사는 원하는대로 정확하게 처리합니다. WPF 응용 프로그램에서 Windows Vista 검색 API를 사용하는 방법 (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

감사를 당신의 대답,하지만 나는 그것이 내가 필요한 것을 생각하지 않는다. 어쩌면 내 업데이트 된 질문을 볼 수 있습니다. –

+0

모든 질문에 답변했습니다. 감사. –

관련 문제