我有两个窗户。我想在一个窗口中单击一个按钮,然后在另一个窗口中启用两个文本框。我的代码似乎正确,我将数据上下文设置为
<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更改似乎只是一个问题。任何帮助将不胜感激。