来自DataTemplate的ContentControl的绑定仅在构造函数中工作
本文关键字:构造函数 工作 绑定 DataTemplate ContentControl 来自 | 更新日期: 2023-09-27 18:27:30
我正试图通过使用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>
这是ShellView.xaml的一个片段(它是包含我想要更改的内容控件的视图):
<ContentControl Content="{Binding Path=CurrentViewModel}" />
这里显示按钮绑定的另一个片段:
<Button Content="Button"
Height="23"
Name="button2"
Width="75"
Command="{Binding Path=DeviceViewCommand}" />
这是ShellViewModel的构造函数。正如我所说,设置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");
}
}
如果我正确理解了您的问题,您可以为CurrentViewModel创建VM类,从INotifyPropertyChanged继承它,并修改它的属性。绑定应该是单向的。
我会后退一步,给ContentControl一个名称,并尝试直接设置Content属性,看看是否有其他问题。此外,ContentControl的DataContext是如何设置的?尝试在setter上设置断点。您也可以检查输出窗口中绑定的错误。
所以我不得不通过打破MVVM模式来解决这个问题。我在shell视图模型的代码背后使用了MVVM轻信使类,只需将内容控件设置为新视图,然后将其数据上下文设置为ShellViewModel的当前视图模型。
我对这个解决方案并不完全满意,但它确实能正常工作。