2016-10-03 74 views
0

Im新到MVVM,并尝试遵循所有我认为尊重它的原则。我想在我的一个用户控件上有一个忙碌动画。我想把它包括在这个控件上。在DataContext中注册UserControl时发生WPF MVVM异常

用户控件它嵌套在上使用一个DataTemplate用于视图模型的主窗口中示出,例如,像这样:

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

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

当运行此,示出了应用与我也看到由于基础值在视图中正确显示,因此可正确绑定的AppConfigViewModel视图。

现在我试图在BusyAnimation的构造这样做是为了注册BusyAnimation在视图模型(从那里控制它):

(DataContext as PageViewModel).BusyAnim = this; 

出于某种原因,在DataContext总是空和这条线的结果是一个例外。我在这里做错了什么?

+1

请务必记得发布您的Exception的stacktrace。它在哪里抛出? – ltiveron

+0

Exception在BusyAnimation的构造函数中抛出。 – Ravior

回答

1

我试图做的是反对MVVM的想法。 我试图向下转换一个意思是一般的对象。

对于我试图实现的任务,更好的方法是在繁忙的动画组件中实现依赖项属性。这些意味着要从主要展示视图的视图模型中绑定。这样,当视图模型中的某些属性改变时,可以显示忙碌的动画。这可能是一个名为“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(); 
    } 
} 

是其大量的代码,但我觉得WPF希望这种方式。记住上面的代码位于繁忙动画用户控件中,并触发控制故事板的Start()Stop()函数。

下面XAML是在使用的busyanimation,它绑定到一个视图模型的busyanimation应说明背景,工作控制:

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

这ShowBusy物业有实现上述的依赖项属性。当然,来自模型的IsBusy应该遵循可观察的模式来运行所有的东西。

/ps:我完全记录了我所犯的错误以及我如何解决它们。我可以摆脱我以某种方式创造这个问题的负面观点吗?