0

この質問で読んだように、ViewModel にプロパティがバインドされています: ContentControlWPF Content: how do I load user controls dynamic? ただし、これをテストしようとすると、アプリが実行されず、Visual Studio XAML UI デザイナーが予期せずクラッシュしたというメッセージが表示され、これがどのように、なぜ起こっているのか手がかりがありません。UserControl

また、私のコードでは、上記の質問で提案されているUserControl代わりにa を使用していることに気付くかもしれません。両方を試しましたが、それぞれ同じエラーが発生します。FrameworkElement

編集:いくつかのテストの後、問題はこのコード行にあることがわかりましたが、理由はわかりません

    private UserControl _currentControl = new TableView();

EDIT2: TableView は でありUserControl、アプリケーションをビルドしてもエラーは発生しないため、上記のコードは問題にならないはずです

いつものように、どんな助けも大歓迎です!

MainWindow.xaml

<Fluent:RibbonWindow x:Class="DatabaseExplorer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Fluent="clr-namespace:Fluent;assembly=Fluent"
        xmlns:View="clr-namespace:DatabaseExplorer.Views"
        xmlns:ignore="http://www.ignore.com"
        mc:Ignorable="d ignore"
        Height="300"
        Width="300"
        Title="Application"
        DataContext="{Binding Main, Source={StaticResource Locator}}">

    <Fluent:RibbonWindow.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Skins/MainSkin.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Fluent:RibbonWindow.Resources>

    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Fluent:Ribbon>
            ...
        </Fluent:Ribbon>
        <ContentControl Grid.Row="1"  Content="{Binding CurrentControl}" />
    </Grid>
</Fluent:RibbonWindow>

MainViewModel.cs

...
    /// <summary>
    /// The <see cref="CurrentControl" /> property's name.
    /// </summary>
    public const string CurrentControlPropertyName = "CurrentControl";

    private UserControl _currentControl = new TableView();

    /// <summary>
    /// Sets and gets the CurrentControl property.
    /// Changes to that property's value raise the PropertyChanged event. 
    /// </summary>
    public UserControl CurrentControl
    {
        get
        {
            return _currentControl;
        }

        set
        {
            if (_currentControl == value)
            {
                return;
            }

            RaisePropertyChanging(CurrentControlPropertyName);
            _currentControl = value;
            RaisePropertyChanged(CurrentControlPropertyName);
        }
    }
...
4

1 に答える 1

1

クラスMainViewModelを呼び出して、UserControlでコードを入れないでください! それはMVVMの方法ではありません:)

MVVM である種の CurrentWorkspace を処理したい場合は、Viewmodels と DataTemplates を使用する必要があります。代わりに、ユーザーコントロールを CurrentWorkspace に設定する - ビューモデルを設定するだけです。

ContentControl Content プロパティに必要なのは、ビューモデルをレンダリングする方法を知るための Datatemplate だけです。

MainViewModel.cs

 public object CurrentWorkspace {get;set;}
 ...
 this.CurrentWorkspace = this._myViewmodelInstanceWithSomeCoolThings;

xaml

<ContentControl Grid.Row="1"  Content="{Binding CurrentWorkspace }" />

コンテンツ コントロールは同じままですが、ビューモデルをレンダリングするにはデータ テンプレートが必要です

xaml - リソース

 <Fluent:RibbonWindow.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Skins/MainSkin.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <DataTemplate DataType="{x:Type local:ViewModelWithSomeCoolthingsClass}">
          <local:MyViewForViewModelWithSomeCoolthingsClass />
        </DataTemplate>
    </ResourceDictionary>      
 </Fluent:RibbonWindow.Resources>
于 2013-05-31T09:52:00.300 に答える