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 のコードは同じですが、独自のビューモデルとそのプロパティ (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 を取得しようとします)。
この問題を解決する方法はありますか? そのため、バインドは CurrentViewModel の型が適切な型である場合にのみ発生します。(コンバーターを使用して、予想される型をパラメーターとして渡すこともできますが、より良い解決策はありますか?)
ありがとう!