2009-08-21 2 views
1

그래서 여기 내 딜레마가 있습니다. 내 뷰 모델에서 뷰 이벤트를 처리하고 싶습니다. 문제는 이벤트 처리기를 추가하기 위해 내 뷰에 파일 뒤에 코드가 있어야하므로 클래스 속성을 설정해야합니다. 나는 이것이 나쁜 생각이고, 솔직히 말하면, 그것을하는 법도 모르겠다. (명백한 x : Class = ""부분을 제외하고). 이것을하기위한 적절한 방법은 무엇인가? MVVM 응용 프로그램?WPF MVVM에서 frameworkElement 이벤트를 viewmodel 핸들러에 바인딩하는 "적절한"방법은 무엇입니까?

<ResourceDictionary> 
    <DataTemplate DataType="{x:Type vm:OutletViewModel}"> 
     <Button Click="IHaveNoBinding"> 
    </DataTemplate> 
</ResourceDictionary> 

답변

4

사용 commands :

<Button Command="{Binding ACommandOnYourViewModel}"/> 

당신이보기 모델에서 사용할 수있는 유용한 명령 구현을 위해 내 this post를 참조하십시오.

명령을 사용할 수 없다고 가정하면 attached command behaviors을 사용하십시오.

+0

좋아, 내가 명령을 사용할 수 없습니다 가정, 그것을 Textbox.TextChanged라고 가정합니다. – Firoso

+0

그에 따라 편집되었습니다. –

+0

텍스트의 경우 바인딩을 사용하십시오. decasteljau

2

첨부 된 동작을 사용합니다. 첨부 된 동작은 기본적으로 이벤트를 명령으로 변환합니다. 예를 들어이 링크를 체크 아웃 :

여기

http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

가 TextChangedBehavior 코드입니다.

public static class TextChangedBehavior 
    { 
    public static readonly DependencyProperty TextChangedCommandProperty = 
     DependencyProperty.RegisterAttached("TextChangedCommand", 
              typeof(ICommand), 
              typeof(TextChangedBehavior), 
              new PropertyMetadata(null, TextChangedCommandChanged)); 

    public static ICommand GetTextChangedCommand(DependencyObject obj) 
    { 
     return (ICommand)obj.GetValue(TextChangedCommandProperty); 
    } 

    public static void SetTextChangedCommand(DependencyObject obj, ICommand value) 
    { 
     obj.SetValue(TextChangedCommandProperty, value); 
    } 

    private static void TextChangedCommandChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     TextBoxBase textBox = obj as TextBoxBase; 

     if (textBox != null) 
     { 
     textBox.TextChanged += new TextChangedEventHandler(HandleTextChanged); 
     } 
    } 

    private static void HandleTextChanged(object sender, TextChangedEventArgs e) 
    { 
     TextBox textBox = sender as TextBox; 
     if (textBox != null) 
     { 
     ICommand command = GetTextChangedCommand(textBox); 
     command.Execute(textBox.Text); 
     } 
    } 
    } 

XAML :

<TextBox behavior:TextChangedBehavior.TextChangedCommand="{Binding TextChangedCommand}" /> 
1

는 일반적으로 나는이 같은 간단한 것들에 대한 첨부 된 행동 패턴을 사용하지 않습니다. 컨설턴트로서 나는 더 새로운 개발자들을 위해 복잡하게 만든다.

그러면 명령을 사용할 수 없을 때 어떻게 제어 상호 작용을 처리 할 수 ​​있습니까? 바닥에서 자기를 데리러 준비하십시오 :-) 나는 종종 이것을 위해 코드를 사용합니다. 코드 배후의 이벤트 핸들러는 이벤트를 처리하고 이벤트 args에서 필요한 모든 데이터를 수집 한 다음 요청을 View Model에 전달합니다. ICommand를 지원하지 않는 대부분의 것들이 hide/show/enable/disable을 활용할 수 없기 때문에 이것을 많이하지 않아도됩니다.

그러나 몇 가지 규칙이 있습니다. 코드 숨김은보기 모델에 대한 제어 전달에만 사용할 수 있습니다. 뷰 모델에 이벤트 인수를 직접 전달하지 않는 한이 방법으로 이벤트를 사용하는 것이 좋습니다. 그 문제는 대규모 응용 프로그램에서 코드 숨김으로부터 벗어날 수없는 경우입니다. 원하는대로 페이지 컨트롤을 사용하면 문제가 발생하지 않습니다.

0

코드 숨김이 나쁜 것은 아닙니다. WPF 데이터 바인딩 (예 : PasswordBox)을 사용할 수없는 충분한 시나리오가 있으며 파일 뒤에 코드를 만들어야합니다.

이 프로젝트의 뷰 모델의 예와 같이 바인딩없이 PasswordBox의 사용 방법 :

WPF 응용 프로그램 프레임 워크 (WAF)

http://waf.codeplex.com

관련 문제