C# 从DataTemplate绑定ContentControl仅在构造函数中工作?
我试图通过使用ICommands切换内容控件的内容。现在,在构造函数中设置此属性有效,但在任何命令中都无效 我的app.xaml中有这个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
<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");
}
}