1

私は大きな長いxamlを持っています。次に、xaml のメニュー部分の UserControl を作成して、きれいにしました (と思います)。メインの xaml コード ビハインドでは、ViewModel クラスをインスタンス化し、それをメインの xaml の DataContext として設定しました。メイン xaml とメニュー xaml が相互に通信できるようにするために、メニュー分離コードのデータ コンテキストと同じビュー モデルを使用することにしました。別の ViewModel クラスをインスタンス化しました。私のコードはこれまでのところ正常に動作します。

しかし、私はこれを正しく行っていないと「感じます」。ViewModel インスタンスのインスタンスは 1 つだけ必要だと思います。しかし、main.xaml.cs と menu.xaml.cs がお互いを認識していないため、インスタンスを共有する方法がわかりません。

4

3 に答える 3

1

プロパティを App.xaml.cs に追加し、コントロールでバインドできます。

最初のアプローチ: XAML リソースとして

あなたのモデル:

public class MyViewModel
{
    public int Hello { get; set; }    
}

アプリ.xaml.cs:

<Application x:Class="WpfApplication12.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:wpfApplication12="clr-namespace:WpfApplication12"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <wpfApplication12:MyViewModel x:Key="MyViewModel" />
    </Application.Resources>
</Application>

小さな注意: これはデフォルト値であるため、オブジェクトに注釈を付ける必要はありませんx:Shared="True"。同じインスタンスが返されます。http://msdn.microsoft.com/en-us/library/aa970778.aspx

あなたのユーザーコントロール:

<UserControl x:Class="WpfApplication12.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid DataContext="{Binding Mode=OneWay, Source={StaticResource MyViewModel}}">
        <TextBlock Text="{Binding Path=Hello}" />
    </Grid>
</UserControl>

モデルはリソースなので、プロパティを作成して取得できます。

public MyViewModel MyViewModel
{
    get { return Application.Current.FindResource("MyViewModel") as MyViewModel; }
}

(ただし、その参照をフィールドに格納したい場合があります。)

第2のアプローチ:従来のプロパティとして

何らかの理由で従来のプロパティを好む場合は、次の構文を使用します。

プロパティは静的であり、静的コンストラクターで初期化されることに注意してください。

public partial class App : Application
{
    static App()
    {
        MyViewModel = new MyViewModel();
    }

    public static MyViewModel MyViewModel { get; set; }
}

ユーザーコントロールでそれにバインドします:

<Grid DataContext="{Binding Source={x:Static wpfApplication12:App.MyViewModel}}"/>
于 2013-10-27T14:35:44.620 に答える
0

次のように、両方のユーザー コントロールを に配置しMainWindow.Xaml、データ コンテキストを設定するMainWindow.xaml.csか、viewmodeltype のビューモデルに静的プロパティを公開できます。

public class ViewModel
{
   private static ViewModel instance = new ViewModel();

   public static Viewmodel Instance
   {
       get
       {
          return instance;
       }
   }
} 

xaml.cs では、次のことができます。

DataContext = ViewModel.Instance;

この行は任意の数の で繰り返すことができます。これxaml.csで、すべての XAML に対してインスタンスが 1 つだけになります。

于 2013-10-27T07:54:28.717 に答える
0

との両方をラップする別のビューを作成し、ラッパー ビューにを設定するMenuViewと、との両方が同じ を継承して使用します。MainViewDataContextMenuViewMainViewDataContext

ラッパー ビューのサンプル XAML:

<UserControl x:Class="WpfApplication1.YourView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:wpfApplication1="clr-namespace:WpfApplication1"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <wpfApplication1:YourMenuView Grid.Row="0"/>
        <wpfApplication1:YourMainView Grid.Row="1"/>
    </Grid>
</UserControl>

および WrapperView の分離コード:

public partial class YourView : UserControl
{
    public YourView()
    {
        InitializeComponent();
        DataContext = new YourViewModel();
    }
}
于 2013-10-27T07:12:48.137 に答える