У меня есть приложение, использующее WPF
mah metro
, где у меня есть tab control
Установка DataContext из ViewModel не в конструкторе
<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>
Я устанавливающее datacontext
в TabItem
. Я создаю 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
в конструкторе. Вместо этого я хочу создать его, когда я нажму кнопку «Подключиться» в своем окне. Однако, когда я нажимаю кнопку «Подключиться» для выполнения метода 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();
}
Можно ли это осуществить?
Смотрите мой ответ здесь http://stackoverflow.com/questions/5650812/how-do-i-bind-a-tabcontrol-to-a-collection-of-viewmodels/5651542#5651542, который показывает, как для работы с TabControl с использованием MVVM. Ваша кнопка должна быть привязана к ICommand в вашей модели просмотра (в зависимости от того, что подходит), и *, который * должен обновлять другие модели представлений, уже привязанные к пользовательскому интерфейсу. Ваши свойства также должны реализовать INotifyPropertyChanged, чтобы сообщить пользовательскому интерфейсу, что значения свойств ... изменены. – Will