0

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 の型が適切な型である場合にのみ発生します。(コンバーターを使用して、予想される型をパラメーターとして渡すこともできますが、より良い解決策はありますか?)

ありがとう!

4

0 に答える 0