无法从另一个窗口中的按钮命令更改文本框的IsEnabled属性?

时间:2018-10-15 01:15:13

标签: c# wpf

我有两个窗户。我想在一个窗口中单击一个按钮,然后在另一个窗口中启用两个文本框。我的代码似乎正确,我将数据上下文设置为

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>

,并且还设置了更改的inotify属性。输出窗口中没有绑定错误,我知道inotifypropertychanged可以工作,因为同一窗口中的按钮会更改isenabled属性,因此问题必须是我要使用的按钮在另一个窗口中。

通过将两个文本框的IsEnabled属性绑定到视图模型中的IsLoggedIn属性来完成整个工作。在带有按钮的窗口中,我将按钮绑定到各自类中的buttoncommands。按钮命令只是这样调用视图模型中的方法

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();
    }
}

视图模型如下所示,请再次注意viewModel中的SwitchEnabled方法,该方法是按钮绑定到的方法。

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>

window2的代码为:

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
<Grid>
    <Button Height="100" Background="Red" Content="Push me too" FontSize="40" Command="{Binding ButtonCommands}"/>
</Grid>

如您所见,我也尝试了数据触发器,但它们也无法正常工作。从另一个窗口进行ui更改似乎只是一个问题。任何帮助将不胜感激。

0 个答案:

没有答案