none
UserControl間でお互いを知らずにデータのやり取りをしたい

    質問

  • MVVMでWPFアプリケーションを作成しています。

    MainWindowに、ユーザコントロールAとユーザーコントロールBを張り付けています。

    ユーザーコントロールAのViewModelのプロパティAに値が設定されたら、その値をユーザーコントロールBのプロパティBに設定したいです。

    ただし、ユーザーコントロールAは単独で別の画面でも使用されるため、ユーザーコントロールBへの参照は持てません。

    ユーザーコントロールAのViewModelのプロパティAが設定されたことを、ユーザーコントロールB側で検知する方法はありませんでしょうか?

    2014年11月11日 11:41

回答

  • 方法1

    ユーザーコントロールAのプロパティAとユーザーコントロールBのプロパティBの両方を添付プロパティにして、プロパティBにコントロールAをバインディングする。
    そのプロパティがUI用のプロパティでModelとは関係ない場合はこちらでもいい。

    方法2
    ViewModeかModelで両方のプロパティの値を持たせて、値変更時にもう一方のプロパティも変更するように作る。
    UI用ではなくModelとして関連しているのであればこちらを推奨します。というか、こうなるはず。

    <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" 
         Title="MainWindow" Height="200" Width="200">
        <StackPanel >
            <!-- 方法1 ModelかViewModeにプロパティA,Bを持たせる方法-->
            <StackPanel  Margin="0,10,0,0" x:Name="sAB">
                <local:UserControlA x:Name="ucA1" Text="{Binding Path=A}"/>
                <local:UserControlB x:Name="ucB1" Text="{Binding Path=B}"/>
            </StackPanel>
    
            <!-- 方法2 お互いに添付プロパティを公開してバインディングする方法-->
            <StackPanel  Margin="0,10,0,0" x:Name="sA">
                <local:UserControlA x:Name="ucA0" Text="{Binding Path=A}" />
                <local:UserControlB x:Name="ucB0" Text="{Binding Path=Text,ElementName=ucA0 }"/>
            </StackPanel>
        </StackPanel>
    </Window>
    <UserControl x:Class="WpfApplication1.UserControlA" 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="50" d:DesignWidth="100"
                 x:Name="uc">
        <Grid>
            <TextBox Text="{Binding Path=Text,ElementName=uc,UpdateSourceTrigger=PropertyChanged}"/>
        </Grid>
    </UserControl>
    <UserControl x:Class="WpfApplication1.UserControlB"  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="50" d:DesignWidth="100"
                 x:Name="uc">
        <Grid>
            <TextBox Text="{Binding Path=Text,ElementName=uc,UpdateSourceTrigger=PropertyChanged}"/>
        </Grid>
    </UserControl>
    C#版
    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.sA.DataContext = new ViewModelA();
    
                this.sAB.DataContext = new ViewModelAB();
            }
        }
    
        class ViewModelBase : System.ComponentModel.INotifyPropertyChanged
        {
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string name)
            {
                var pc = PropertyChanged;
                if (pc != null)
                {
                    pc(this, new System.ComponentModel.PropertyChangedEventArgs(name));
                }
            }
        }
    
        /// <summary>ユーザーコントロールAのみに設定するViewModel</summary>
        class ViewModelA : ViewModelBase
        {
            public virtual string A
            {
                get { return _A; }
                set
                {
                    if (_A != value)
                    {
                        _A = value;
                        OnPropertyChanged("A");
                    }
                }
            }
            private string _A;
        }
    
        /// <summary>ユーザーコントロールAとBの両方のViewModelとする</summary>
        class ViewModelAB : ViewModelA
        {
            public override string A
            {
                get { return _A; }
                set
                {
                    base.A = value;
                    B = value;
                }
            }
            private string _A;
    
            public string B
            {
                get { return _B; }
                set
                {
                    if (_B != value)
                    {
                        _B = value;
                        A = value;
                        OnPropertyChanged("B");
                    }
                }
            }
            private string _B;
        }
    
        /// <summary>添付プロパティとしてTextを定義してあるユーザーコントロールA</summary>
        public partial class UserControlA : UserControl
        {
            public UserControlA()
            {
                InitializeComponent();
            }
    
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
    
            public static readonly DependencyProperty TextProperty =
                DependencyProperty.Register
                ("Text"
                , typeof(string)
                , typeof(UserControlA)
                , new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        }
    
        /// <summary>添付プロパティとしてTextを定義してあるユーザーコントロールB</summary>
        public partial class UserControlB : UserControl
        {
            public UserControlB()
            {
                InitializeComponent();
            }
    
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
    
            public static readonly DependencyProperty TextProperty =
                DependencyProperty.Register
                ("Text"
                , typeof(string)
                , typeof(UserControlB)
                , new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        }
    }
    VB.net版
    Imports System.ComponentModel
    
    Class MainWindow
        Sub New()
    
            ' この呼び出しはデザイナーで必要です。
            InitializeComponent()
    
            ' InitializeComponent() 呼び出しの後で初期化を追加します。
            Me.sA.DataContext = New ViewModelA()
    
            Me.sAB.DataContext = New ViewModelAB()
        End Sub
    End Class
    
    Class ViewModelBase
        Implements System.ComponentModel.INotifyPropertyChanged
    
        Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    
        Protected Overridable Sub OnPropertyChanged(ByVal name As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
        End Sub
    End Class
    
    
    ''' <summary>ユーザーコントロールAのみに設定するViewModel</summary>
    Class ViewModelA
        Inherits ViewModelBase
    
        Private _A As String
    
        Public Overridable Property A() As String
            Get
                Return Me._A
            End Get
            Set(value As String)
                If Me._A <> value Then
                    Me._A = value
                    Me.OnPropertyChanged("A")
                End If
            End Set
        End Property
    End Class
    
    ''' <summary>ユーザーコントロールAとBの両方のViewModelとする</summary>
    Class ViewModelAB
        Inherits ViewModelA
    
        Private _A As String
        Private _B As String
    
        Public Overrides Property A() As String
            Get
                Return Me._A
            End Get
            Set(value As String)
                MyBase.A = value
                Me.B = value
            End Set
        End Property
    
        Public Property B() As String
            Get
                Return Me._B
            End Get
            Set(value As String)
                If Me._B <> value Then
                    Me._B = value
                    Me.A = value
                    Me.OnPropertyChanged("B")
                End If
            End Set
        End Property
    End Class
    
    ''' <summary>添付プロパティとしてTextを定義してあるユーザーコントロールA</summary>
    Partial Public Class UserControlA
        Inherits UserControl
    
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Public Property Text() As String
            Get
                Return CStr(MyBase.GetValue(UserControlA.TextProperty))
            End Get
            Set(value As String)
                MyBase.SetValue(UserControlA.TextProperty, value)
            End Set
        End Property
    
        Public Shared ReadOnly TextProperty As DependencyProperty _
             = DependencyProperty.Register _
                ("Text", GetType(String), GetType(UserControlA) _
                , New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault))
    End Class
    
    ''' <summary>添付プロパティとしてTextを定義してあるユーザーコントロールB</summary>
    Partial Public Class UserControlB
        Inherits UserControl
    
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Public Property Text() As String
            Get
                Return CStr(MyBase.GetValue(UserControlA.TextProperty))
            End Get
            Set(value As String)
                MyBase.SetValue(UserControlA.TextProperty, value)
            End Set
        End Property
    
        Public Shared ReadOnly TextProperty As DependencyProperty _
             = DependencyProperty.Register _
                ("Text", GetType(String), GetType(UserControlB) _
                , New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault))
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2014年11月11日 13:54 VB版追加
    • 回答の候補に設定 星 睦美 2014年11月12日 1:30
    • 回答としてマーク holi_s 2014年11月13日 8:02
    2014年11月11日 13:28
  • 参考用にサンプルを考えてみました。コードが非常に長くなため、ブログに記事を起こしています。

    WPF で画面とユーザーコントロールの連携を考えてみた

    何かの参考になれば幸いです。


    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    2014年11月13日 5:49
    モデレータ

すべての返信

  • 方法1

    ユーザーコントロールAのプロパティAとユーザーコントロールBのプロパティBの両方を添付プロパティにして、プロパティBにコントロールAをバインディングする。
    そのプロパティがUI用のプロパティでModelとは関係ない場合はこちらでもいい。

    方法2
    ViewModeかModelで両方のプロパティの値を持たせて、値変更時にもう一方のプロパティも変更するように作る。
    UI用ではなくModelとして関連しているのであればこちらを推奨します。というか、こうなるはず。

    <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApplication1" 
         Title="MainWindow" Height="200" Width="200">
        <StackPanel >
            <!-- 方法1 ModelかViewModeにプロパティA,Bを持たせる方法-->
            <StackPanel  Margin="0,10,0,0" x:Name="sAB">
                <local:UserControlA x:Name="ucA1" Text="{Binding Path=A}"/>
                <local:UserControlB x:Name="ucB1" Text="{Binding Path=B}"/>
            </StackPanel>
    
            <!-- 方法2 お互いに添付プロパティを公開してバインディングする方法-->
            <StackPanel  Margin="0,10,0,0" x:Name="sA">
                <local:UserControlA x:Name="ucA0" Text="{Binding Path=A}" />
                <local:UserControlB x:Name="ucB0" Text="{Binding Path=Text,ElementName=ucA0 }"/>
            </StackPanel>
        </StackPanel>
    </Window>
    <UserControl x:Class="WpfApplication1.UserControlA" 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="50" d:DesignWidth="100"
                 x:Name="uc">
        <Grid>
            <TextBox Text="{Binding Path=Text,ElementName=uc,UpdateSourceTrigger=PropertyChanged}"/>
        </Grid>
    </UserControl>
    <UserControl x:Class="WpfApplication1.UserControlB"  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="50" d:DesignWidth="100"
                 x:Name="uc">
        <Grid>
            <TextBox Text="{Binding Path=Text,ElementName=uc,UpdateSourceTrigger=PropertyChanged}"/>
        </Grid>
    </UserControl>
    C#版
    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.sA.DataContext = new ViewModelA();
    
                this.sAB.DataContext = new ViewModelAB();
            }
        }
    
        class ViewModelBase : System.ComponentModel.INotifyPropertyChanged
        {
            public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string name)
            {
                var pc = PropertyChanged;
                if (pc != null)
                {
                    pc(this, new System.ComponentModel.PropertyChangedEventArgs(name));
                }
            }
        }
    
        /// <summary>ユーザーコントロールAのみに設定するViewModel</summary>
        class ViewModelA : ViewModelBase
        {
            public virtual string A
            {
                get { return _A; }
                set
                {
                    if (_A != value)
                    {
                        _A = value;
                        OnPropertyChanged("A");
                    }
                }
            }
            private string _A;
        }
    
        /// <summary>ユーザーコントロールAとBの両方のViewModelとする</summary>
        class ViewModelAB : ViewModelA
        {
            public override string A
            {
                get { return _A; }
                set
                {
                    base.A = value;
                    B = value;
                }
            }
            private string _A;
    
            public string B
            {
                get { return _B; }
                set
                {
                    if (_B != value)
                    {
                        _B = value;
                        A = value;
                        OnPropertyChanged("B");
                    }
                }
            }
            private string _B;
        }
    
        /// <summary>添付プロパティとしてTextを定義してあるユーザーコントロールA</summary>
        public partial class UserControlA : UserControl
        {
            public UserControlA()
            {
                InitializeComponent();
            }
    
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
    
            public static readonly DependencyProperty TextProperty =
                DependencyProperty.Register
                ("Text"
                , typeof(string)
                , typeof(UserControlA)
                , new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        }
    
        /// <summary>添付プロパティとしてTextを定義してあるユーザーコントロールB</summary>
        public partial class UserControlB : UserControl
        {
            public UserControlB()
            {
                InitializeComponent();
            }
    
            public string Text
            {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
            }
    
            public static readonly DependencyProperty TextProperty =
                DependencyProperty.Register
                ("Text"
                , typeof(string)
                , typeof(UserControlB)
                , new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
        }
    }
    VB.net版
    Imports System.ComponentModel
    
    Class MainWindow
        Sub New()
    
            ' この呼び出しはデザイナーで必要です。
            InitializeComponent()
    
            ' InitializeComponent() 呼び出しの後で初期化を追加します。
            Me.sA.DataContext = New ViewModelA()
    
            Me.sAB.DataContext = New ViewModelAB()
        End Sub
    End Class
    
    Class ViewModelBase
        Implements System.ComponentModel.INotifyPropertyChanged
    
        Public Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged
    
        Protected Overridable Sub OnPropertyChanged(ByVal name As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(name))
        End Sub
    End Class
    
    
    ''' <summary>ユーザーコントロールAのみに設定するViewModel</summary>
    Class ViewModelA
        Inherits ViewModelBase
    
        Private _A As String
    
        Public Overridable Property A() As String
            Get
                Return Me._A
            End Get
            Set(value As String)
                If Me._A <> value Then
                    Me._A = value
                    Me.OnPropertyChanged("A")
                End If
            End Set
        End Property
    End Class
    
    ''' <summary>ユーザーコントロールAとBの両方のViewModelとする</summary>
    Class ViewModelAB
        Inherits ViewModelA
    
        Private _A As String
        Private _B As String
    
        Public Overrides Property A() As String
            Get
                Return Me._A
            End Get
            Set(value As String)
                MyBase.A = value
                Me.B = value
            End Set
        End Property
    
        Public Property B() As String
            Get
                Return Me._B
            End Get
            Set(value As String)
                If Me._B <> value Then
                    Me._B = value
                    Me.A = value
                    Me.OnPropertyChanged("B")
                End If
            End Set
        End Property
    End Class
    
    ''' <summary>添付プロパティとしてTextを定義してあるユーザーコントロールA</summary>
    Partial Public Class UserControlA
        Inherits UserControl
    
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Public Property Text() As String
            Get
                Return CStr(MyBase.GetValue(UserControlA.TextProperty))
            End Get
            Set(value As String)
                MyBase.SetValue(UserControlA.TextProperty, value)
            End Set
        End Property
    
        Public Shared ReadOnly TextProperty As DependencyProperty _
             = DependencyProperty.Register _
                ("Text", GetType(String), GetType(UserControlA) _
                , New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault))
    End Class
    
    ''' <summary>添付プロパティとしてTextを定義してあるユーザーコントロールB</summary>
    Partial Public Class UserControlB
        Inherits UserControl
    
        Public Sub New()
            InitializeComponent()
        End Sub
    
        Public Property Text() As String
            Get
                Return CStr(MyBase.GetValue(UserControlA.TextProperty))
            End Get
            Set(value As String)
                MyBase.SetValue(UserControlA.TextProperty, value)
            End Set
        End Property
    
        Public Shared ReadOnly TextProperty As DependencyProperty _
             = DependencyProperty.Register _
                ("Text", GetType(String), GetType(UserControlB) _
                , New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault))
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2014年11月11日 13:54 VB版追加
    • 回答の候補に設定 星 睦美 2014年11月12日 1:30
    • 回答としてマーク holi_s 2014年11月13日 8:02
    2014年11月11日 13:28
  • ユーザーコントロールA・B の参照を MainWindow の ViewModel に管理させ、MainViewModel 内で連携を取らせてはいかがでしょうか?そうすれば各コントロール間は疎結合ですみますし、他の画面でもユーザーコントロールの ViewModel を使用できます。実際私もこのように実装してます。

    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    • 回答の候補に設定 星 睦美 2014年11月12日 1:30
    2014年11月11日 13:32
    モデレータ
  • 私もひらぽんさんと同じパターンで実装しています。MainWindowのViewModelは2つのユーザーコントロールのViewModelの参照を得ていますから、2つのユーザーコントロールを操作することは容易です。ユーザーコントロールのプロパティに変化があったことは、MainWindowのViewModelはイベントとして通知してもらえば良いでしょう。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年11月12日 1:30
    2014年11月11日 16:22
    モデレータ
  • みなさま

    返信ありがとうございます。

    いただいた回答を元にどのように実装するのか検証してみたいと思います。

    結論等出ましたら報告させていただきます。

    2014年11月12日 1:22
  • 「ユーザーコントロールAのプロパティAが設定されたら、その値をユーザーコントロールBのプロパティBに設定する」を
    以下のように実装しました。

    ・MainWindowViewModelにユーザーコントロールBの参照を持たせる。
    ・ユーザーコントロールAのプロパティAと、MainWindowViewModelのプロパティZをバインドし、
     プロパティZのsetterでユーザーコントロールBのViewModelのプロパティBへ設定する。
    ・MainWindowのコードビハインドで、ユーザーコントロールAのデータコンテキストに、MainWindowViewModelを設定する。

    MainWindowViewModelを経由して、ユーザーコントロールA,Bの連携をしましたが、ユーザーコントロールAのViewModelに
    MainWindowViewModelを設定することに違和感があります。gekkaさんにサンプルとして挙げていただいたViewModelABを
    MainWindowViewModelに変えたのですが、これはMainWindow、ユーザーコントロールA、Bをそれぞれ3つのプロジェクトに
    分割して使用したいので、MainWindowプロジェクトにユーザーコントロールを冠したVMが存在することに若干の違和感を覚えたので、
    変えました。
    MainWindow配下のコントロールにMainWindowのVMを設定するのは、やるべきではないでしょうか?

    2014年11月13日 3:16
  • ・MainWindowViewModelにユーザーコントロールBの参照を持たせる。

    すみません。いま読み返したところ、先の私の返信に誤りがありました。 「ユーザーコントロールA・B の参照を MainWindow の ViewModel に管理」 ではなく、「ユーザーコントロールA・B の各ViewModelの参照を MainWindow の ViewModel に管理」  でした。コントロールの参照をViewModel に管理させたら、密結合になってしまいます(大汗

    MainWindow配下のコントロールにMainWindowのVMを設定するのは、やるべきではないでしょうか?

    ケースバイケースとは思いますが、今回のように画面と各コントロールをプロジェクトとして独立させたい場合、コントロール側に ViewModel を設け、画面側の ViewModel と連携取るように設計した方がよさそうに思えます。


    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    2014年11月13日 3:43
    モデレータ
  • ひらぽんさんが、

    >すみません。いま読み返したところ、先の私の返信に誤りがありました。

    と書かれていますが、私が書いた、

    >私もひらぽんさんと同じパターンで実装しています。

    は、MainWindowのViewModelが、ユーザーコントロールのViewModelと連携するという意味です。よって、ひらぽんさんが記述を訂正されていましたが、それと同じ意味になります。

    続いて、

    >MainWindow配下のコントロールにMainWindowのVMを設定するのは、やるべきではないでしょうか?

    のご質問ですが、結論から言えば全く問題ありません。Windowと2つのUserControlはそれぞれのViewModelによって管理されています。これらが1つの画面を構成するわけですから、これら3つのViewModelが連携を取って1つの画面が動作するのは自然なことでしょう。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年11月13日 4:19
    モデレータ
  • 参考用にサンプルを考えてみました。コードが非常に長くなため、ブログに記事を起こしています。

    WPF で画面とユーザーコントロールの連携を考えてみた

    何かの参考になれば幸いです。


    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    2014年11月13日 5:49
    モデレータ
  • ・MainWindowViewModelにユーザーコントロールBの参照を持たせる。

    すみません。上は誤りで「ユーザーコントロールBのViewModelの参照を持たせる」にしています。

    回答をくださった皆さん、ありがとうございました。おかげで一歩MVVMの理解が進みました。

    また、ソースを提供していただいた、gekkaさん、ひらぽんさん、非常に勉強になりました。

    最後にひらぽんさんが提示してくれた方法でやるとMainWindow側で各ユーザーコントロールのViewModelを管理しつつ、

    各ユーザーコントロールはお互いを知らないまま連携できるので、理想の形です。(Livetというツールが今回使えるかわかりませんが。。。)

    ありがとうございました。

    今回の要件の実現方法としては、gekkaさんのサンプルを元に実現しましたので、gekkaさんの投稿を回答としてマークいたします。

    • 編集済み holi_s 2014年11月13日 8:01
    2014年11月13日 7:58