0

XAML ウィンドウ間で ViewModel を共有しようとしています。これは、オブジェクト インスタンスの複数のビューが ViewModel からイベントを受信できるようにするために必要です。

XAML で ViewModel をリソースとして指定し、別のコンストラクターで上書きしても機能しません。バインドは、既定のコンストラクターで作成された既定のインスタンスに引き続き行われ、適切なインスタンスからイベントを受け取ったり、更新したりしません。

これは動作しません:

MyWindow.xaml:

<Window x:Class="MyNamespace.MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNamespace"
    Title="My Window"
    Width="700" Height="550">
<Window.Resources>
    <local:MyViewModel x:Key="MyModel"/>
</Window.Resources>
    <ContentPresenter Content="{StaticResource MyModel}"/>
</Window>

MyWindow.xaml.cs

imports ...;

namespace MyNamespace {
    public partial class MyWindow {

        public MyWindow() {
            InitializeComponent();
        }

        public MyWindow(MyViewModel model)
                : this() {
            Resources["MyModel"] = model;
        }
    }
}

これもありません:

MyWindow.xaml.cs

imports ...;

namespace MyNamespace {
    public partial class MyWindow {

        public MyWindow()
                : this(new MyViewModel()) { }

        public MyWindow(MyViewModel model) {
            Resources["MyModel"] = model; // Resources not yet initialized!
            InitializeComponent();
        }
    }
}
4

2 に答える 2

1

Microsoft.Practices.Unity を使用している場合は、TransientLifetimeManagerを使用できます。ビューモデルのオブジェクトが 1 つだけ作成されるようにします。

于 2012-12-02T14:01:39.423 に答える
0

MyThis は、コード ビハインドでプロパティを使用し、次のように StaticResource ではなく XAML で Binding タグを使用して行うことができます。

MyWindow.xaml:

<Window x:Class="MyNamespace.MyWindow"
    x:Name="this"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNamespace"
    Title="My Window"
    Width="700" Height="550">
    <ContentPresenter Content="{Binding MyModel, ElementName=this}"/>
</Window>

MyWindow.xaml.cs

imports ...;

namespace MyNamespace {
    public partial class MyWindow {

        public MyViewModel MyModel { get; private set; }

        public MyWindow()
                : this(new MyViewModel()) { }

        public MyWindow(MyViewModel model) {
            MyModel = model;
            InitializeComponent();
        }
    }
}

複数のウィンドウ (または他のコンポーネント) が同じモデル インスタンスを使用できます。

2012 年 12 月 6 日編集: XAML が正しくなく、バインドが機能しませんでした。ルート要素 (Window) に x:Name 属性を追加し、バインドされた要素 (ContentPresenter) の Content 属性に ElementName 引数を追加しました。

于 2012-11-30T23:16:48.667 に答える