WPF mvvm按钮(ICommand)CanExecute不工作



我有这个xaml和这个Code。我的问题是确认不更改。CanExecute是非执行一次。

<Label Grid.Row="0" Grid.Column="0"  Content="Connection String"/>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding  Path=ConnectionString,UpdateSourceTrigger=PropertyChanged}" ></TextBox>
<Button Grid.Row="1" Grid.Column="0"  Content="Load"  Command="{Binding BtnLoad,UpdateSourceTrigger=PropertyChanged}"></Button>
<Button Grid.Row="1" Grid.Column="1"  Content="Confirm" Command="{Binding BtnConfirm}"></Button>
<Button Grid.Row="1" Grid.Column="2"  Content="Add" Command="{Binding BtnAdd,UpdateSourceTrigger=PropertyChanged}"></Button>
</Grid>


public MainViewModel(ILogRepository logRepository)
{
_logRepository = logRepository;
_listOfLogs = new List<Log>();
BtnAdd = new BtnAdd(AddLog);
BtnConfirm = new BtnConfirm(ConfimLog, LogIsSelected);
BtnLoad = new BtnLoad(LoadLogTable);
}
private bool LogIsSelected()
{
// return true;
//Funktionerit im WPF nicht
if (_selectedLogItem != null)
return true;
return false;
}

这里有一个示例,向您展示了can execute方法的工作原理。当连接字符串输入字段中有文本时,确认按钮将启用。它与您的代码不完全一样,但您引用的是我在XAML中看不到的列表。

MainWindow.xaml(后面的代码中没有任何内容(

<Window x:Class="FrameworkCanExecuteExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FrameworkCanExecuteExample"
mc:Ignorable="d"
Title="MainWindow"
Width="300"
Height="100">
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Text="Connection string:" />
<TextBox Grid.Column="1" Text="{Binding Path=ConnectionString, UpdateSourceTrigger=PropertyChanged}" />
<Button Grid.Row="1" Grid.ColumnSpan="2"  Content="Confirm"  Command="{Binding BtnConfirm}" />
</Grid>
</Window>

MainViewModel.cs

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
namespace FrameworkCanExecuteExample
{
public class MainViewModel : INotifyPropertyChanged
{
private string connectionString;
public event PropertyChangedEventHandler PropertyChanged;
public MainViewModel()
{
BtnConfirm = new RelayCommand(Confirm, CanConfirm);
}
public string ConnectionString
{
get => connectionString;
set
{
connectionString = value;
OnPropertyChanged();
}
}
public ICommand BtnConfirm { get; }

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void Confirm(object parameter)
{
}
private bool CanConfirm(object parameter)
{
return !string.IsNullOrWhiteSpace(connectionString);
}
}
}

RelayCommand.cs

using System;
using System.Windows.Input;
namespace FrameworkCanExecuteExample
{
public class RelayCommand : ICommand
{
private Action<object> execute;
private Func<object, bool> canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return canExecute == null || canExecute(parameter);
}
public void Execute(object parameter)
{
execute(parameter);
}
}
}

最新更新