2011-12-28 2 views

답변

1

MVVM pattern에 따르면 ViewModel은보기를 인식하지 않으므로 허용되지 않습니다. ViewModel View와 상호 작용하면 명령을 트리거 할 수 있으며 바인딩을 사용할 수도 있습니다. 또한 BusyIndicator와 같은 UI 관련 항목을 ViewModel 수준으로 옮겨서는 안됩니다.

구체적인 사용 사례에 대한 자세한 정보를 제공하십시오.보기의 메서드를 호출 할 때 및이 메서드의 용도를 지정하십시오.

+0

내 UI에는이 기능이있는 사용자 정의 컨트롤에서 파생 되었기 때문에 코드 숨김을 통해서만 시작할 수있는 "통화 중"표시기가 있습니다. 따라서 서버에서 데이터를 가져 오는 것과 관련하여이 사용중 표시기를 설정하려면 viewmodel이 필요합니다. – foreyez

+0

XAML에서 BusyInduicator를 선언하고 Bindings를 ViewModel 속성으로 설정할 수 있습니까? ViewModel이이 표시기를 정확히 설정하는 방법은 무엇입니까? ViewModel에 의한 BudyIndicator 초기화 코드를 보여줄 수 있습니까? 또한 BusyIndicator와 같은 UI 관련 항목을 ViewModel 수준으로 옮겨서는 안됩니다. – sll

0

위의 대답에 대한 답장을 보았습니다. ViewModel에서 데이터를 검색 한 다음보기에서 통화 중이던 표시기를 중지하겠다고 말하고 있습니다.

내 솔루션이 최선의 솔루션이 될지 확실하지 않지만 시도해 볼 수는 있습니다. 누군가 틀릴 수도 있습니다.

보기에서 볼 때 ViewModel의 메소드를 호출하여 데이터 세트를 읽는 것이 좋습니다. 이 메서드에서는 대리자 (보기에있는 메서드를 가리키는)를 전달할 수 있으며 ViewModel이 서버에서 데이터 집합을 읽는 것을 완료하면보기의 메서드에 연결된 대리자 (뷰 모델에서)를 트리거합니다. 통화 중 표시기를 중지 할 수 있습니다.

그래서보기에 당신은

void StopBusyIndicator() 
{ 
    this.BusyIndicator.IsBusy = false; 
} 

을 가지고이 같은

전화를 데이터 집합을 읽도록 뷰 모델을 호출 할 때 :

ViewModel.ReadDataSet(()= >StopBusyIndicator) 

로 StopBusyIndicator 방법을 통과 할 대리자는 ReadDataSet의 끝에서 호출 할 수 있습니다.

HTH

0

데이터 전송 객체를 허용하는 동작 클래스를 작성할 수 있습니다. DTO 내에서 "View"라는 속성을 추가하고 현재보기에 할당합니다. 뷰의 코드 숨김 내에서 컨트롤러를 통해 액션을 호출하고, DTO를 unbox하면 이제 액션 클래스 내에서 뷰를 완전히 제어 할 수 있습니다.

모델에서이 작업을 수행하려는 경우 모델에 "보기"유형 매개 변수가있는 메소드를 만든 다음 실행하여 현재보기를 전달하십시오.

15

MVVM의 어려움은 간단한 것을 이해하는 것이 었습니다. ViewModel에 대해 알고있는 것. 나는 바인딩과 명령을 사용하고 있었지만 그들은 단순하다. stringsxaml. 런타임시 안전 해결 때문에 (오류는 오타가 발생할 수 있음을 의미하지만 소프트웨어가 중단되지 않음) 이로 인해 은 뷰 모델에서과 분리됩니다 (적어도 컴파일 할 때). 그리고 저는이 디커플링, 예를 들어 행동을 유지하기위한 해결책을 항상 찾고있었습니다.

진실은 당신이 일반적으로 윈도우의 DataContext입니다 모델을보고 직접 액세스 할 수 있습니다입니다/사용자 제어 :

var vm = (MyViewModel)this.DataContext; 

뷰 모델에서보기 메서드를 호출 아마도 가장 좋은 방법은 이벤트를 사용하여, 그것을 알고 뷰 모델은 구독자가 있는지 알지 못하기 때문에 뷰 또는 다른 뷰 모델에서 이벤트 및 이벤트를 사용할 수 있습니다.

// define in the view model 
public delegate void MyEventAction(string someParameter, ...); 
public event MyEventAction MyEvent; 

// rise event when you need to 
MyEvent?.Invoke("123", ...); 

// in the view 
var vm = (MyViewModel)DataContext; 
vm.MyEvent += (someParameter, ...) => ... // do something 
+0

예에서 구문이 올바른 것처럼 보이지 않습니다. 나는 그것이 작동하도록하기 위해 그것을 많이 바꿔야 만합니다. – Deantwo

+1

@Deantwo, 3 년 전 ['EventHandler '] (https://msdn.microsoft.com/en-us/library/db0etb8x (v = vs.110) .aspx)을 많이 사용하지 않았으며 상속받지 못했습니다. 매개 변수에 대한'EventArgs'에서 ... 순간적으로 오타를 수정했습니다,보고 해 주셔서 감사합니다. – Sinatr

1

보기 (코드 숨김)에서 이와 같이 할 수 있습니다.

하나의 특정 ViewModel 유형으로 제한되지 않도록 ViewModel에서 구현할 인터페이스로 변환됩니다.

// CONSTRUCTOR 
    public SomeView() 
    { 
     InitializeComponent(); 

     DataContextChanged += DataContextChangedHandler; 
    } 

    void DataContextChangedHandler(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var viewModel = e.NewValue as IInterfaceToBeImplementedByViewModel; 

     if (viewModel != null) 
     { 
      viewModel.SomeEvent += (sender, args) => { someMethod(); } 
     } 
    }