0

MainWindow.xaml の CodeBehind を削除しました。これは、文字通りそれを行う必要がある小さなプロジェクトを行っているためです。

したがって、xaml を介してこの方法で ViewModel のインスタンスを作成しています。

<Grid.DataContext>
    <lib:StartPageViewModel />
</Grid.DataContext>

さてDataContext、他のソリューションを開きたいので、コード (StartPageViewModel) でこれが必要です (詳細については、こちらを参照してください)。

この DataContext を取得する方法についてのアイデアはありますか?

4

3 に答える 3

1

少なくとも私は問題を解決しました。実際、これにDataContextを使用する必要はありませんでした。

    public static DTE2 GetDTE(DataContext dataContext)
    {
        ICustomTypeDescriptor typeDescriptor = dataContext as ICustomTypeDescriptor;
        Debug.Assert(typeDescriptor != null, "Could not get ICustomTypeDescriptor from dataContext. Was the Start Page tool window DataContext overwritten?");
        PropertyDescriptorCollection propertyCollection = typeDescriptor.GetProperties();
        return propertyCollection.Find("DTE", false).GetValue(dataContext) as DTE2;
    }

コードを次のように変更しました。これで完全に機能し、DataContextを使用せずにソリューションを開くことができます。

    public static DTE2 GetDTE()
    {
        return (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE");
    }
于 2012-09-11T14:59:36.753 に答える
0

XAMLファイルでビューモデルを宣言したことはありませんが、試してみましたか?

viewName.DataContext as ViewModelType;

ところで、コードビハインドを削除することは通常良い習慣です。

于 2012-09-11T10:04:33.057 に答える
0

ViewModel は、View について何も認識してはなりません。

したがって、「適切な」MVVM を適用する場合、ViewModel 内から DataContext にアクセスしようとしてはいけません。

StartPageViewModelDataContext に配置されるオブジェクトの IS 部分のコード。thisこれは、ViewModel のコードでを使用してオブジェクトにアクセスできることを意味します。

グリッド (または VisualTree のさらに上位) を探している場合は、Xaml のプロパティを使用して渡すことができます。

<Grid Name="MyGrid">
    <Grid.DataContext>
        <lib:StartPageViewModel MyParent={Binding ElementName=MyGrid} />
    </Grid.DataContext>
</Grid>

それでも、それを行うと、View に関する知識を ViewModel に追加することになります。

于 2012-09-11T10:00:45.803 に答える