2016-10-03 5 views
0

Im new для MVVM и стараюсь следовать всем рекомендациям, которые я нахожу для его уважения. Я хотел бы иметь Busy-Animation на одном из моих пользовательских элементов управления. Я хочу включить его в элемент управления, как это.Исключение WPF MVVM при регистрации UserControl в DataContext

UserControl он вложен в показано на MainWindow с помощью DataTemplate для ViewModel, например, следующим образом:

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

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

При выполнении этого приложения показан и я также см представление для AppConfigViewModel, которое правильно связывается, поскольку базовые значения отображаются правильно в представлении.

Теперь я пытался зарегистрировать BusyAnimation в ViewModel (контролировать его оттуда), делая это в Застройщиком BusyAnimation:

(DataContext as PageViewModel).BusyAnim = this; 

По какой-то причине DataContext всегда нуль и результатом этой строки является исключение. Что я здесь делаю неправильно?

+1

Всегда помните, чтобы публиковать стопку Exception. Где его бросили? – ltiveron

+0

Исключение выбрано в конструкторе BusyAnimation. – Ravior

ответ

1

То, что я пытался сделать, противоречит идее MVVM. Я попытался сбить объект, который должен быть общим.

Лучшее aproach для задачи, которую я пытался достичь, - это реализовать свойства зависимостей в компоненте занятой анимации. Предполагается, что они должны быть связаны с viewmodel в основном отображаемого вида. таким образом, оживленная анимация может отображаться при изменении какого-либо свойства в модели viewmodel. Это может быть, например, bool с именем «working».

это зависимость код недвижимости в моей занятой анимации:

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(); 
    } 
} 

Да его много кода, но я чувствую МОФ хочет это таким образом. Помните, что код находится в пользовательском элементе busy-animation и запускает функции Start() Stop(), которые контролируют раскадровки.

Ниже XAML находится под контролем, который использует busyanimation, связывая его с ViewModel, что busyanimation следует указать фоновую работу для:

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

Это ShowBusy собственности есть реализован выше Dependency Property. Конечно, IsBusy из модели должен следовать наблюдаемому шаблону, чтобы все работало.

/ps: Я полностью документировал ошибки, которые я сделал, и как я их решил. Могу ли я избавиться от негативных моментов, которые я получил как-то для создания этого вопроса?

Смежные вопросы