2016-12-15 6 views
0

でのviewmodelのDataContextのがない設定私は私がTabItemdatacontextを設定していますtab controlは、コンストラクタ

<Controls:MetroAnimatedTabControl Grid.Column="3" Grid.Row="1" SelectedIndex="{Binding SelectedTabIndex,Mode=TwoWay}"> 
     <TabItem Header="Manual Control"> 
      <view:ManualControlView DataContext="{Binding ManualControlViewModel}"/> 
     </TabItem> 
     <TabItem Header="Set up"> 
      <view:SetupView DataContext="{Binding SetupViewModel}"/> 
     </TabItem> 
    </Controls:MetroAnimatedTabControl> 

を持ってmah metroを使用してWPFアプリケーションを持っています。私はTcpCllientを作成し、その参照を各ViewModelに渡しています。私がコンストラクタでこれをしているとき、すべてうまく動作します。

public MainViewModel() 
    { 
     _client = new TcpClient(IP_ADDRESS, PORT); 
     _client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); 
     _master = ModbusIpMaster.CreateIp(_client); 

     ManualControlViewModel = new ManualControlViewModel(_master); 
     SetupViewModel = new SetupViewModel(_master); 

    } 

ただし、TcpClientはコンストラクタには作成しません。代わりに私は私のウィンドウの "接続"ボタンを押すと、それを作成したいと思います。しかし、私の "Connect"ボタンをクリックしてOnConnectメソッドを実行すると、私のビューはdatacontextに設定されていません。

private void OnConnect(object obj) 
    { 
     _client = new TcpClient(IP_ADDRESS, PORT); 
     _client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); 
     _master = ModbusIpMaster.CreateIp(_client); 
     Connected = _client.Connected; 

     ManualControlViewModel = new ManualControlViewModel(_master); 
     SetupViewModel = new SetupViewModel(_master);   

     StartReadingInfo(); 
    } 

これは可能ですか?

+0

方法を示しており、ここで私の答えhttp://stackoverflow.com/questions/5650812/how-do-i-bind-a-tabcontrol-to-a-collection-of-viewmodels/5651542#5651542を参照してください。 MVVMを使用してTabControlを操作します。あなたのボタンはあなたのビューモデル内のICommandにバインドされるべきであり、UIに既にバインドされている他のビューモデルを更新する必要があります。また、プロパティ値が変更されたことをUIに通知するために、プロパティにINotifyPropertyChangedも実装する必要があります。 – Will

答えて

1

ViewModelのプロパティを更新するとき、プロパティが変更されたことをControlに通知する必要があります。

 public class ViewModel : INotifyPropertyChanged 
     { 

      public SetupViewModel SetupViewModel 
      { 
       get { return m_SetupViewModel; } 
       set 
       { 
        m_SetupViewModel = value; 
        OnPropertyChanged(); 
       } 
      } 

      public ManualControlViewModel ManualControlViewModel 
      { 
       get { return m_ManualControlViewModel; } 
       set 
       { 
        m_ManualControlViewModel = value; 
        OnPropertyChanged(); 
       } 
      } 

      public event PropertyChangedEventHandler PropertyChanged; 

      private void OnConnect(object obj) 
      { 
       _client = new TcpClient(IP_ADDRESS, PORT); 
       _client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true); 
       _master = ModbusIpMaster.CreateIp(_client); 
       Connected = _client.Connected; 

       ManualControlViewModel = new ManualControlViewModel(_master); 
       SetupViewModel = new SetupViewModel(_master); 

       StartReadingInfo(); 
      } 

      private void OnPropertyChanged([CallerMemberName] string PropertyName = "") 
      { 
       var handler = PropertyChanged; 
       if (handler != null) handler(this, new PropertyChangedEventArgs(PropertyName)); 
      } 

      private ManualControlViewModel m_ManualControlViewModel; 
      private SetupViewModel m_SetupViewModel; 
     } 
関連する問題