2012-03-11 50 views
0

我试图通过使用ICommands切换内容控件的内容。现在设置此属性在构造函数中工作,但不在任何命令中。来自DataTemplate的ContentControl的绑定只能在构造函数中使用?

我有这个在我的App.xaml

<Application.Resources> 
    <vm:ViewModelLocator x:Key="Locator" 
         d:IsDataSource="True" /> 
    <DataTemplate DataType="{x:Type vm:HomeViewModel}"> 
     <views:HomeView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:DeviceViewModel}"> 
     <views:DeviceView /> 
    </DataTemplate> 
</Application.Resources> 

这是从ShellView.xaml片段(这是它包含内容控制我想更改视图):

<ContentControl Content="{Binding Path=CurrentViewModel}" /> 

此处显示按钮绑定的另一个代码片段:

<Button Content="Button" 
       Height="23" 
       Name="button2" 
       Width="75" 
       Command="{Binding Path=DeviceViewCommand}" /> 

这里是ShellView的构造函数模型。正如我所说的设置CurrentViewModel在这里工作。 (你会注意到我设置了设备,然后回家作为测试。)

public ShellViewModel() 
    { 
     CurrentViewModel = ShellViewModel._deviceViewModel; 
     CurrentViewModel = ShellViewModel._homeViewModel; 
     HomeViewCommand = new RelayCommand(() => ExecuteHomeViewCommand()); 
     DeviceViewCommand = new RelayCommand(() => ExecuteDeviceViewCommand()); 
     LogOut = new RelayCommand(() => LogOutExecute(),() => true); 

    } 

    private void ExecuteDeviceViewCommand() 
    { 
     CurrentViewModel = ShellViewModel._deviceViewModel; 

    } 

我在这里做错了什么?

这也是为当前视图模型更改的属性。应该早些时候添加这个。

public ViewModelBase CurrentViewModel 
    { 
     get 
     { 
      return _currentViewModel; 
     } 
     set 
     { 
      if (_currentViewModel == value) 
       return; 
      _currentViewModel = value; 
      RaisePropertyChanged("CurrentViewModel"); 
     } 
    } 
+0

它看起来像你使用MVVM,但我可能是错的,但我只是想说我还没有得到。不过,我很好奇,如果CurrentViewModel是一个依赖属性或触发器PropertyChanged? – Silvermind 2012-03-11 23:24:16

+0

我是的,我会标记它,但它似乎并不是一个特定的MVVM问题。我已经在上面添加了PropertyChanged代码。 – benjgorman 2012-03-11 23:30:47

+0

这里的代码看起来都是正确的。你有没有在ExecuteDeviceViewCommand中设置一个断点来验证它是在button2上被调用的? – 2012-03-12 01:29:27

回答

0

所以我不得不通过打破MVVM模式来解决这个问题。我在我的shell视图模型后面的代码中使用了MVVM light messenger类,以简单地将内容控件设置为新视图,然后将其数据上下文设置为ShellViewModel的当前视图模型。

我对这个解决方案并不完全满意,但它的功能正确。

1

如果我理解正确的probled,您可以创建VM类CurrentViewModel,从INotifyPropertyChanged的继承它,修改它`财产。 Bindng应该是单向的。

+0

这就是我所做的。然而,该物业似乎并没有改变。 – benjgorman 2012-03-11 23:38:06

+0

当您尝试提升PropertyChanged事件时,是否为null? – dvvrd 2012-03-11 23:55:17

+0

不管该命令设置的值是否更改。该视图根本不会改变以反映这一点。我认为内容控制绑定存在问题。 – benjgorman 2012-03-11 23:59:34

1

我会退后一步并给ContentControl一个名称,并尝试直接设置Content属性以查看是否有其他错误。此外,如何为ContentControl设置DataContext?尝试在setter上设置断点。您还可以检查输出窗口中的绑定错误。

相关问题