2016-10-03 2 views
0

MVVM을 처음 사용하고 존중할만한 모든 지침을 따르십시오. 내 usercontrols 중 하나에 바쁜 애니메이션 싶습니다. 나는 이것을 이와 같은 통제에 포함시키고 자한다.DataContext에 UserControl을 등록 할 때 WPF MVVM 예외가 발생했습니다.

UserControl을는 그것과 같이, 예를 들면, 뷰 모델에 대한의 DataTemplate을 사용 MainWindow를에 도시되어 중첩되어이 실행되면

<Window.Resources> 
    <DataTemplate DataType="{x:Type AppViews:AppConfigViewModel}"> 
     <local:AppConfigView /> 
    </DataTemplate> 
</Window.Resources> 

<Grid> 
    <ContentControl Content="{Binding CurrentPageViewModel}" /> 
</Grid> 

애플리케이션은 도시 내가 참고 기본 값이 뷰에 올바르게 표시되기 때문에 바인드 된 AppConfigViewModel에 대한 뷰. DataContext를 항상 널 (null)과 일부 이유로

(DataContext as PageViewModel).BusyAnim = this; 

:

는 지금은 BusyAnimation의 생성자에서이 작업을 수행하여 (거기에서 그것을 제어하는) 뷰 모델에 BusyAnimation를 등록하려고 이 행의 결과는 예외입니다. 여기서 내가 뭘 잘못하고 있니?

+1

항상 Exception의 스택 추적을 게시하십시오. 그것이 던져지는 곳은 어디입니까? – ltiveron

+0

예외는 BusyAnimation의 생성자에서 throw됩니다. – Ravior

답변

1

내가 MVVM에 대한 아이디어에 반대하여 시도한 바가 있습니다. 나는 일반적인 것을 의미하는 객체를 다운 캐스팅하려고 시도했다.

내가 시도한 작업에 대한 더 나은 aproach는 바쁜 애니메이션 구성 요소에 종속성 속성을 구현하는 것입니다. 이것들은 주로 표시되는 뷰의 뷰 모델로부터 구속되는 것을 의미합니다. 뷰 모델의 일부 속성이 변경되면 바쁜 애니메이션이 표시 될 수 있습니다. 예를 들어 "일하는"이라는 이름을 가진 부울 일 수 있습니다.

public static readonly DependencyProperty ShowBusyProperty = DependencyProperty.Register("ShowBusy", typeof(Boolean), typeof(FortschrittView), new PropertyMetadata(false, OnShowBusyPropertyChanged)); 
public Boolean ShowBusy 
{ 
    get { return (Boolean)this.GetValue(ShowBusyProperty); } 
    set { this.SetValue(ShowBusyProperty, value); } 
} 

private static void OnShowBusyPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    FortschrittView myUserControl = dependencyObject as FortschrittView; 
    myUserControl.OnPropertyChanged("ShowBusy"); 
    myUserControl.OnShowBusyPropertyChanged(e); 
} 
private void OnShowBusyPropertyChanged(DependencyPropertyChangedEventArgs e) 
{ 
    if(ShowBusy) 
    { 
     Start(); 
    } 
    else 
    { 
     Stop(); 
    } 
} 

예는 코드의 많은,하지만 난 그런 식으로 원하는 WPF 느낌 :

내 바쁜 애니메이션의 종속성 속성 코드입니다. 위의 코드는 바쁜 애니메이션 사용자 컨트롤에 있음을 기억하고 스토리 보드를 제어하는 ​​Start() Stop() 함수를 트리거합니다.

<local:BusyAnimation ShowBusy="{Binding Model.IsBusy}"/> 

이 ShowBusy 재산권하는 종속성 속성은 위의 구현이 : XAML 아래

는 busyanimation가 배경-작업을 표시해야 뷰 모델에 바인딩의 busyanimation를 사용하는 컨트롤입니다. 물론 모델의 IsBusy는 모든 것이 작동하는 관찰 가능한 패턴을 따라야합니다.

/ps : 나는 실수를 문서화하고 어떻게 해결 했습니까? 나는이 질문을 만들면서 어떻게 든 부정적 포인트를 없앨 수 있습니까?

관련 문제