C# 从DataTemplate绑定ContentControl仅在构造函数中工作?

C# 从DataTemplate绑定ContentControl仅在构造函数中工作?,c#,wpf,C#,Wpf,我试图通过使用ICommands切换内容控件的内容。现在,在构造函数中设置此属性有效,但在任何命令中都无效 我的app.xaml中有这个 <Application.Resources> <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> <DataTemplate DataType="{x:Type vm:HomeViewMode

我试图通过使用ICommands切换内容控件的内容。现在,在构造函数中设置此属性有效,但在任何命令中都无效

我的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>
我做错什么了吗

这也是为当前视图模型更改的属性。应该早点加上这个

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

如果我正确理解了您的问题,您可以为CurrentViewModel创建VM类,从INotifyPropertyChanged继承它并修改它的属性。binding应该是单向的。

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

因此我必须打破MVVM模式来解决这个问题。我在shell视图模型的代码隐藏中使用了MVVM light messenger类,只需将内容控件设置为新视图,然后将其数据上下文设置为ShellViewModel的当前视图模型


我对这个解决方案不太满意,但它确实正常工作。

看起来您使用的是MVVM,但我可能错了,但我只是想说我还没有做到这一点。然而,我很好奇CurrentViewModel是一个dependencyproperty还是triggers PropertyChanged?是的,我会标记它,但它似乎不是一个特定的MVVM问题。我在上面添加了PropertyChanged代码。这里的代码看起来都是正确的。您是否在ExecuteDeviceViewCommand中设置了断点以验证在按钮2单击时调用该命令?是的,在按钮单击时调用该命令。这就是我所做的。但是,属性似乎没有更改。尝试引发PropertyChanged事件时,PropertyChanged事件是否为null?否。该值将更改为命令将其设置为的任何值。这一观点根本没有改变以反映这一点。我假设内容控件绑定有问题。当然,值会更改。如果PropertyChanged为空,即view未订阅它,则
很有趣。您还可以作弊以观察它是否应该工作,并直接从setter设置内容,或者从代码隐藏创建新绑定。没有转换器,这种绑定是如何工作的?您尝试将视图属性(内容)设置为viewmodel对象。这很奇怪,或者我不明白什么是在_currentviewmodel中重写的相等运算符?
<Button Content="Button"
                Height="23"
                Name="button2"
                Width="75"
                Command="{Binding Path=DeviceViewCommand}" />
    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");
        }
    }