У меня есть два окна.Я хочу нажать кнопку в одном окне, и это позволит два текстовых поля в другом окне.Мой код кажется правильным, у меня установлен контекст данных, например
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
, а также установлен inotifypropertyolated.В окне вывода ошибок привязки нет, и я знаю, что inotifypropertychanged работает, потому что кнопка в том же окне изменяет свойство isenabled, поэтому проблема заключается в том, что кнопка, которую я хочу использовать, находится в другом окне.
Все это работает путем привязки свойства IsEnabled двух текстовых полей к свойству IsLoggedIn в модели представления.В окне с кнопкой у меня есть кнопки, привязанные к кнопкам команд их собственного класса.Команды кнопки просто вызывают метод в модели представления как таковой
class ButtonCommands : ICommand
{
private readonly MainWindowViewModel viewModel;
public ButtonCommands(MainWindowViewModel viewModel)
{
this.viewModel = viewModel ?? throw new ArgumentNullException(nameof(viewModel));
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
viewModel.SwitchEnabled();
}
}
Модель представления выглядит следующим образом, снова обратите внимание на метод SwitchEnabled в viewModel, который является методом, к которому привязывается кнопка.
class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
ButtonCommands = new ButtonCommands(this);
}
private bool _isLoggedIn = false;
public bool IsLoggedIn
{
get => _isLoggedIn;
set
{
if(_isLoggedIn != value)
{
_isLoggedIn = value;
OnPropertyChanged("IsLoggedIn");
}
}
}
public void SwitchEnabled()
{
IsLoggedIn = true;
}
public ICommand ButtonCommands { get; }
/// <summary>
/// if property is changed, invoke new propertychanged event
/// </summary>
/// <param name="propertyName"></param>
public void OnPropertyChanged(string propertyName)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// default PropertyChanged event
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
}}
Когда я отлаживаю код, значение свойства верное, оно переходит в true, и если вы посмотрите на значение xaml, оно показывает true, но текстовые поля никогда не включаются.Я потратил больше недели, пытаясь понять это.Я знаю, что это не совсем соответствует mvvm, но я просто хочу сделать эту работу.Код для главного окна:
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<Window.Resources>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding IsLoggedIn}" Value="True">
<Setter Property="IsEnabled" Value="True"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel>
<TextBox Background="Red" Height="100" IsEnabled="{Binding IsLoggedIn}"/>
<TextBox Background="Blue" Height="100" IsEnabled="{Binding IsLoggedIn}"/>
<Button Content="Push me" FontSize="40" Background="Yellow" Height="100" Command="{Binding ButtonCommands}"/>
</StackPanel>
код для окна 2:
<Window.DataContext>
<local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
<Button Height="100" Background="Red" Content="Push me too" FontSize="40" Command="{Binding ButtonCommands}"/>
</Grid>
Как видите, я также пробовал триггеры данных, но они тоже не работают.Кажется, есть проблема с изменением пользовательского интерфейса из другого окна.Любая помощь будет принята с благодарностью.