2008-09-11 8 views
9

내 WPF UI에 대한 M-V-VM 패턴을 따르고 있습니다. 내 ViewModel 클래스에있는 명령 TextBox의 TextChanged 이벤트에 명령을 연결하고 싶습니다. 이 작업을 완료 할 수있는 유일한 방법은 TextBox 컨트롤에서 상속하고 ICommandSource를 구현하는 것입니다. 그런 다음 TextChanged 이벤트에서 해고 명령을 지시 할 수 있습니다. 이것은 너무 단순한 것처럼 보이기에는 너무 많은 일로 보인다.TextBox.TextChanged & ICommandSource

TextBox를 서브 클래 싱하고 ICommandSource를 구현하는 것보다 쉬운 방법이 있습니까? TextChanged 이벤트를 ViewModel 클래스에 연결하는 것입니다.

답변

18

먼저, PropertyChanged의 UpdateSourceTrigger를 사용하여 뷰 모델에 양방향 데이터 바인딩을 고려해야합니다. 그런 식으로 바인딩하는 속성의 속성 설정자는 텍스트가 변경 될 때마다 호출됩니다.

충분하지 않다면 첨부 된 동작을 사용하여이 문제를 해결할 것입니다. 줄리안 도밍 게즈 (Julian Dominguez)의 블로그에서 WPF에 쉽게 적용 할 수있는 실버 라이트에서 비슷한 것을하는 방법에 대해서는 article을 찾을 수 있습니다.

기본적으로 정적 클래스 (TextBoxBehaviours라고 함)에서는 ICommand 유형의 (아마도) TextChangedCommand라는 연결 속성을 정의합니다. 해당 속성에 대한 OnPropertyChanged 처리기를 연결하고 처리기 내에서 TextBox에 속성이 설정되어 있는지 확인합니다. 있는 경우 속성에 지정된 명령을 호출하는 텍스트 상자의 TextChanged 이벤트에 처리기를 추가합니다.

그런 다음 뷰 모델을 가정하는 것은 당신의보기의 DataContext에 할당 된, 당신은 그것을 좋아 사용합니다 :

<TextBox 
    x:Name="MyTextBox" 
    TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" /> 
+1

감사 샘 - 가끔은 간단한 옵션을 보지 못했습니다; 이 경우에는 내 ViewModel의 문자열 속성에 바인딩 된 텍스트 상자가 있습니다. –

+0

속성 설정자에게 논리를 추가하는 것이 효과가 있다고 생각하지 않습니다. WPF XAML 프로세서는 속성 래퍼를 사용하지 않고 직접 종속성 속성을 사용합니다. 즉, UI가 업데이트 될 때 setter가 호출되지 않습니다. (출처 : http://msdn.microsoft.com/en-us/library/bb613563.aspx) – Greg

+2

그렉, 나는 의존성 속성이 바인딩 된 ViewModel 속성의 Setter를 말하는 것이지 setter가 아닙니다. 의존성 프로퍼티 자체의 –

3

TextChanged 이벤트를 처리하고 거기에서 명령을 실행할 수 없습니까? 당신이 말한대로

private void _textBox_TextChanged(object sender, EventArgs e) 
{ 
    MyCommand.Execute(null); 
} 

대안은, 명령 소스 역할을하는 TextBox를 만드는 것입니다,하지만 당신이 공유를 계획하고 여러 곳에서 활용하고 뭔가가 아니라면 그 잔인한 사람처럼 보인다.

8

바인딩 및 명령 방법은 옳은 일을 사용하지 않을 수도 있습니다 이벤트를 사용. 이 명령은 정확히 무엇을 수행합니까?

VM의 문자열 필드에 데이터 바인딩을 사용하는 것이 좋습니다. 이렇게하면 UI 관리가 아닌 명령이나 함수를 호출 할 수 있습니다.

<TextBox Text="{Binding WorldName}"/> 
.... 
public string WorldName 
{ 
    get 
    { 
     return WorldData.Name; 
    } 
    set 
    { 
     WorldData.Name = value; 
     OnPropertyChanged("WorldName"); 
     // CallYourCustomFunctionHere(); 
    } 
} 
+0

감사합니다 Nidonocu. 당신의 대답도 완벽 합니다만, 나는 당신의 대답보다 약간 전에 대답했기 때문에 샘의 대답을 대답으로 표시했습니다. 다시 한번 감사드립니다! –