gpt4 book ai didi

wpf - 为什么即使调用 CommandManager.InvalidateRequerySuggested() 也不会调用 WPF 按钮命令的 CanExecute 方法?

转载 作者:行者123 更新时间:2023-12-01 13:48:46 25 4
gpt4 key购买 nike

我面临这些问题中报告的相同问题:

Button Command CanExecute not called when property changed

How can I force a textbox change to enable my command in WPF?

(简而言之:我的命令链接按钮在应该启用时没有启用)但有一点不同:我已经尝试调用 CommandManager.InvalidateRequerySuggested(),使用没有结果

最奇怪的是,只有当我“触发”窗口上的任何事件时,按钮才会启用,比如在窗口的任何位置单击鼠标。

这里是重现问题的代码:

<Window x:Class="WpfApplication1.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:WpfApplication1"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.CommandBindings>
<CommandBinding Command="{x:Static local:Commands.RunTask}" x:Name="cmdRunTask" CanExecute="CanExecuteRunTask" Executed="ExecuteRunTask"> </CommandBinding>
<CommandBinding Command="{x:Static local:Commands.PushButton}" x:Name="cmdPushButton" CanExecute="CanPushButton" Executed="PushButton"></CommandBinding>
</Window.CommandBindings>
<StackPanel>
<Button Content="Run task"
x:Name="runButton"
Command="{x:Static local:Commands.RunTask}"
>
</Button>
<ProgressBar x:Name="progress"
Value="{Binding Path=Value, Mode=OneWay}"
Height="30"
>
</ProgressBar>
<Button Content="Press me if you dare"
x:Name="pushButton"
Command="{x:Static local:Commands.PushButton}"
>
</Button>
</StackPanel>

using System;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
DataContext = new Model();
((Model)DataContext).PropertyChanged += DataContext_PropertyChanged;
InitializeComponent();
}

private void DataContext_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Ready":
CommandManager.InvalidateRequerySuggested();
break;
}
}

void CanExecuteRunTask(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}

void ExecuteRunTask(object sender, ExecutedRoutedEventArgs e)
{
((Model)DataContext).RunLongTask();
}

void CanPushButton(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = ((Model)DataContext).Ready;
}

void PushButton(object sender, ExecutedRoutedEventArgs e) { }
}

public static class Commands
{
public static readonly RoutedUICommand RunTask = new RoutedUICommand();
public static readonly RoutedUICommand PushButton = new RoutedUICommand();
}

public class Model : INotifyPropertyChanged
{
private bool _ready = false;
public bool Ready
{
get { return _ready; }
set
{
_ready = value;
RaisePropertyChanged("Ready");
}
}

private int _value = 0;
public int Value
{
get { return _value; }
set
{
_value = value;
RaisePropertyChanged("Value");
}
}

public async void RunLongTask()
{
await RunLongTaskAsync();
}
private Task RunLongTaskAsync()
{
this.Ready = false;
Task t = new Task(() => {
for (int i = 0; i <= 100; i++)
{
Value = i;
System.Threading.Thread.Sleep(20);
}
this.Ready = true;
});
t.Start();
return t;
}

public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

最佳答案

虽然“PropertyChanged”事件会自动编码,但不会自动编码对 CommandManager.InvalidateRequerySuggested() 的调用。

因此,要解决此问题,只需确保按如下方式在 Dispatcher 线程上进行调用:

    private void DataContext_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Ready":
var d = Application.Current.Dispatcher;
if (d.CheckAccess())
CommandManager.InvalidateRequerySuggested();
else
d.BeginInvoke((Action)(() => { CommandManager.InvalidateRequerySuggested(); }));
break;
}
}

依赖由异步任务触发的属性更改时要小心。

我希望这可以帮助你们中的一些人节省一些工作时间...

关于wpf - 为什么即使调用 CommandManager.InvalidateRequerySuggested() 也不会调用 WPF 按钮命令的 CanExecute 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33671287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com