我正在尝试使用ContentControl和DataTemplate在我的代码中切换视图模型。代码工作,它似乎正确绑定,但我在输出中得到一个错误:
System.Windows.Data Error: 40 : BindingExpression path error: 'Value1' property not found on 'object' ''ViewModel2' (HashCode=1202201)'. BindingExpression:Path=Value1; DataItem='ViewModel2' (HashCode=1202201); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'Value2' property not found on 'object' ''ViewModel1' (HashCode=7634749)'. BindingExpression:Path=Value2; DataItem='ViewModel1' (HashCode=7634749); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
MainView(容器)的代码:
<DataTemplate DataType="{x:Type local:ViewModel1}" >
<local:View1 DataContext="{Binding ElementName=UserControlContainer, Path=Content}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ViewModel2}" >
<local:View2 DataContext="{Binding ElementName=UserControlContainer, Path=Content}"/>
</DataTemplate>
...
<ContentControl x:Name="UserControlContainer" Content="{Binding CurrentViewModel}"/>
MainViewModel.cs包含:
private ViewModelBase m_viewModel = null;
public ViewModelBase CurrentViewModel
{
get
{
return m_viewModel;
}
set
{
m_viewModel = value;
RaisePropertyChanged("CurrentViewModel");
}
}
private void EventTimer(object sender, EventArgs e)
{
if (CurrentViewModel == null || CurrentViewModel.GetType() == typeof(ViewModel1))
{
CurrentViewModel = new ViewModel2();
}
else
{
CurrentViewModel = new ViewModel1();
}
CommandManager.InvalidateRequerySuggested();
}
ViewModel1和ViewModel2都有相同的代码,只是它们引用自己的viewmodel及其上的属性(ViewModel1为Value1,ViewModel2为Value2):
ViewModel1:
public class ViewModel1 : ViewModelBase
{
public double m_value = new Random((int)DateTime.Now.ToBinary()).NextDouble();
public string Value1
{
get { return m_value.ToString(); }
}
}
视图1:
<TextBlock Text="{Binding Value1}"/>
我想问题是,当计时器更改属性CurrentViewModel中的ViewModel时,未显示的视图仍在内存中并尝试绑定到错误的ViewModel(因此View2尝试从ViewModel1获取Value2)。 / p>
有什么方法可以解决这个问题吗?因此,只有当CurrentViewModel的类型属于正确类型时才会发生绑定。 (我可以使用转换器并将期望的类型作为参数传递但是,有没有更好的解决方案?)
谢谢!