1

私の WPF アプリケーションでは、リソース ディクショナリを使用しています。私もMVVMを使用しています。

ResourceDictionary にバインドしていますが、MainWindow ViewModel を (Window タイプの) MainWindow にバインドしたいのですが、MVVM では、UserControl タイプではない MainWindow として許可されません。

   <Grid.Resources>
        <ResourceDictionary Source="Resources\ResourceDictionary.xaml" />
    </Grid.Resources>

    <Grid.DataContext>
        <Binding Source="{StaticResource Mwvm}" />
    </Grid.DataContext>
</Grid>

これは私がこれを行うことができないことを意味します

<DataTemplate DataType="{x:Type viewModel:MainWindowViewModel}">
    <root:MainWindow x:Key="Mwvm" />
</DataTemplate>

オブジェクトがウィンドウであり、XAML のみを使用している場合に同じことを行う方法を知っている人はいますか (app.xaml onstartup() のコードビハインドでこれを行うことができることを知っています)?

EDIT これを明確にするために、MainWindow内でViewModelに名前空間を宣言できることを知っていますが、名前空間がResourceDictionaryで既に参照されており、ResourceDictionaryを参照している場合、これは正しい方法です.

4

1 に答える 1

1

うーんどうですか?

<Window>
    <Window.DataContext>
        <someNs:YourVmClass /> <!-- calls the empty c_tor of the class-->
    </Window.DataContext>
</Window>

(あなたの質問を理解できたかどうかはわかりませんが、それがあなたが本当に望んでいることだと思います。)

あなたの編集によると:

確かにあなたは次のようなことができます

<!-- Define an instance of your VM in the ResourceDictionary -->
<ResourceDictionary>
    <someNs:YourVmClass x:Key="InstOfYourVmClass" />
</ResourceDictionary>

あなたの見解では、このようなことができます。

<Grid>
    <Grid.Resources>
        <ResourceDictionary Source="Resources\ResourceDictionary.xaml" />
    </Grid.Resources>

    <Grid.DataContext>
        <StaticResource ResourceKey="InstOfYourVmClass" />
    </Grid.DataContext>
</Grid>

しかし、このアプローチを選択しないことを強くお勧めします。問題は、これを参照するたびにResourceDictionary、現在のインスタンスInstOfYourVmClassが新しいインスタンス化されたバージョンによって上書きされることです。

于 2013-06-05T14:10:52.903 に答える