Изменение свойства IsEnabled текстового поля из команды кнопки в другом окне не работает? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть два окна.Я хочу нажать кнопку в одном окне, и это позволит два текстовых поля в другом окне.Мой код кажется правильным, у меня установлен контекст данных, например

<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>

Как видите, я также пробовал триггеры данных, но они тоже не работают.Кажется, есть проблема с изменением пользовательского интерфейса из другого окна.Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...