Silverlight和WPF中MVVM场景的接口,用于将命令从模型绑定到控件(按钮)。
我的 WPF 应用程序中有一个自定义控件,其中有一个“应用”按钮。当用户单击按钮时,我想在我的视图模型(业务逻辑)上执行命令,但我也想执行...
我正在寻找有关处理 wpf mvvm 项目中越来越多的命令的建议。 我的视图模型收集了大量的模型,我觉得在项目成熟之前我需要做
我目前有一个带有 ICommand 的按钮,当 CanExecute 返回 true 时启用该按钮,当 CanExecute 返回 false 时禁用该按钮。代码如下所示: 我目前有一个带有 ICommand 的按钮,当 CanExecute 返回 true 时启用该按钮,当 CanExecute 返回 false 时禁用该按钮。代码如下所示: <Button Command="{Binding CommandEdit}" Content="Edit" /> 现在我想要第三个选项,如果按钮被禁用,也可以隐藏该按钮。但这必须是可选的,即并非所有禁用的按钮都应该隐藏,有时可以为状态 x 禁用按钮并为状态 y 隐藏。 我的第一个想法是向名为 Hidden() 的命令添加新方法并在样式中获取该方法,但我不知道如何在样式中获取该命令。 <Button Command="{Binding CommandEdit}" Content="Edit" Style="{StaticResource DefaultButton}" /> <Style x:Key="DefaultButton" TargetType="Button" BasedOn="{StaticResource DefaultButtonStyle}"> <Style.Triggers> <DataTrigger Binding="{Binding Command.Hidden}" Value="True"> <Setter Property="Visibility" Value="Collapsed" /> </DataTrigger > </Style.Triggers> </Style> 如果我无法以样式访问该命令,您知道如何区分禁用和隐藏吗? 从 UI 的角度来看,(在您的任务中)按钮是否禁用并不重要。 您的任务是使禁用的按钮不可见。 对于 Collapsed,使用 .Net 中已有的转换器就足够了: <!-- In your resources section of the XAML --> <BooleanToVisibilityConverter x:Key="BoolToVis" /> <Button Command="{Binding CommandEdit}" Content="Edit" Visibility="{Binding IsEnabled, RelativeSource={RelativeSource Self}, Converter={StaticResource BoolToVis}}" /> 对于隐藏或状态反转,您需要使用自己的自定义转换器或设置样式触发器。
WinUI:ICommand 实现 - CanExecuteChanged 为 null 并且 UI 未刷新
请参阅代码示例。启动时,CanExecuteButtonClick 方法将被评估一次。执行 CanExecuteButtonClick 方法时,将评估 CanClick 属性。我…
将 ReturnCommand 添加到 WPF 自定义文本框
我有一个自定义文本框控件,它工作得很好。 公共类 TextBoxExt :文本框 { 公共事件 ehEmptyArgument ClearAll,保存; 公共 TextBoxExt() { 设置资源参考...
.net 8 Maui 应用程序 ICommand RelayCommand 不起作用
除了相关信息之外,我几乎删除了所有内容。 BaseViewModel继承自ObservableObject。 我从传统的 WPF MVVM 方法开始,但无法再使 ICommands 工作。
Blazor - 如何使用 ICommand 在按钮单击中执行表单提交
如何使用 ICommand 在 Button 单击中执行表单提交 如何在ICommand执行中传递参数 @使用System.Windows.Input Blazor 按钮 如何使用 ICommand 在 Button 单击中执行表单提交 如何在ICommand执行中传递参数 @using System.Windows.Input <button @onclick="buttonClick"> Blazor Button</button> @code { private ICommand _command; public ICommand Command { get => _command; set => _command = value; } private void buttonClick() { this.Command?.Execute(null); } } 据我所知,这是不可能的,因为 System.Windows.Input(例如 ICommand)适用于 WPF 而不是 Blazor。 终于,我得到了答案,请参考以下链接。 https://github.com/virzak/blazor-wasm/commit/6b15c5f5dc61e333c3dbfec41fd09dd40cd5302f <button @onclick="@(() => Model.DecrementCommand.Execute(true))"> Blazor Button</button> @code { CommandModel Model = new CommandModel(); } public class CommandModel { public ICommand DecrementCommand; public int age = 30; public CommandModel() { DecrementCommand = new RelayCommand<bool>(DecrementExecute); } public void DecrementExecute(bool decrement) { if (decrement) { age -= 1; } else { age += 1; } } } 看看 blazorise 和reactiveui.blazor。 Blazise 按钮支持 icommand。 我的理解是,在 Blazor 中使用 ICommand 的根本问题是 ICommand.Execute 返回 void,因此是一劳永逸。 这在 WPF/Maui/UWP 中是可以的,因为发生的任何状态更改都会通过绑定(特别是 INotifyPropertyChanged.PropertyChanged 事件)传达给视图。 但是,Blazor 不使用 INotifyPropertyChanged,而是依赖于 Blazor 特定的重新渲染逻辑(请参阅:ComponentBase 的渲染约定)。在按钮点击场景中,具体是: 收到事件通知并调用其自己的事件处理程序之一后。 如果您的命令不执行任何异步工作,它将按照调用事件处理程序的通知进行工作,并且所有内容都会同步处理,因此在事件处理程序完成后,所有内容都会完成。 但是如果您的 ICommand 执行任何异步操作(现在可能会执行),ICommand.Execute 会立即返回,并且 Blazor 会重新渲染周期。 Command.Execute 下的异步代码仍在运行,执行一些工作并更改一些属性。 Blazor 永远不会收到任何这些 INotifyPropertyChanged 事件的通知,因此永远不会刷新。 对于简单的场景,您可以通过自己监视 PropertyChanged 事件、添加处理程序并调用 StateHasChanged() 来解决此问题,但添加然后删除所有可能的 PropertyChanged 源需要大量工作。
CurrentViewModel 属性更改未反映在 ContentControl 中
我目前正在构建一个应用程序,用户可以通过一组单选按钮选择不同的页面。当页面处于活动状态时,我希望单选按钮被检查为 true。当b...
基本 PowerShell XAML 按钮绑定到 ICommand
我有以下 PowerShell 脚本,它只不过是一个 XAML WPF GUI,其中有一个按钮,单击该按钮时应该显示 MessageBox。它加载正确,但单击时不执行任何操作。
WPF CommandBindings、ViewModel 和 UserControl
我对 WPF 还很陌生,所以最好描述一下其意图: 我的主窗口内有多个用户控件。每个用户控件都有自己的按钮,我想将其绑定到
ContentDialog - 用于 SecondButtonCommand 的内容
我正在创建一个通用的异常消息对话框,并且希望有一个“复制错误”按钮将错误文本复制到剪贴板。我不知道该用来做什么
我有一个 DataGrid,我试图向其中添加带有命令绑定的 ContextMenu。 ContextMenu 的定义如下: 我有一个 DataGrid,我试图向其中添加一个带有命令绑定的 ContextMenu。 ContextMenu 的定义如下: <DataGrid Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="4" Name="DgResults" Margin="10, 25, 10,10" AutoGenerateColumns="False"> <DataGrid.ContextMenu> <ContextMenu> <MenuItem Command="{Binding GenerateDutyCycleCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" Header="Generate DC"></MenuItem> </ContextMenu> </DataGrid.ContextMenu> </DataGrid> 在 Window 的代码隐藏中,我定义了命令属性: private ICommand? _command; public ICommand GenerateDutyCycleCommand { get { var m = 0; return _command ??= new CommandHandler(GenerateDutyCycle, CanExecute); } } public void GenerateDutyCycle() { MessageBox.Show("Command Executed"); var selectedItem = DgResults.SelectedItem; var p = 0; } public bool CanExecute() { return Results.Count > 0; } 在 XAML 中,如果我右键单击 GenerateDutyCycleCommand 并选择 转到定义,它会按预期转到属性,所以似乎一切都是正确的。 当我运行代码时,总是显示 ContextMenu 并且永远不会命中 CanExecute 方法。同样,如果我单击菜单项,则永远不会点击 GenerateDutyCycle 方法(或显示消息框)。我尝试了几次修改(例如,将 DataContext 的 MenuItem 设置为 Window),但没有成功。 我在运行时还看到存在 XAML 绑定失败,其中指出 找不到源:RelativeSource FindAncestor、AncestorType='System.Windows.Window'、AncestorLevel='1'。我不清楚为什么这个绑定会失败,如果它可以识别定义(通过Go To Definition)。 任何帮助/指导将不胜感激。短暂性脑缺血发作。 更新:我能够通过从ContextMenu中删除DataGrid定义并添加样式(到Window.Resources)来使这个部分工作,如下所示: <Style TargetType="{x:Type DataGridRow}"> <Setter Property="Tag" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext}"/> <Setter Property="ContextMenu"> <Setter.Value> <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> <MenuItem Command="{Binding GenerateDutyCycleCommand}" Header="Generate DC"></MenuItem> </ContextMenu> </Setter.Value> </Setter> </Style> 使用这种样式,当 DataGrid 中没有结果时,ContextMenu 不会显示。但是, CanExecute 和 GenerateDutyCycle 方法中的断点仍然没有被命中。另外,当有结果并单击菜单项时,不会显示 MessageBox。 我设法通过添加 ContextMenu 作为 DataGrid 的资源,然后将其分配在行的样式中,如下所示找到解决方案: <DataGrid.Resources> <ContextMenu x:Key="CtxDataGrid"> <ContextMenu.Items> <MenuItem Header="Generate DC" Command="{Binding GenerateDutyCycleCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/> </ContextMenu.Items> </ContextMenu> </DataGrid.Resources> <DataGrid.RowStyle> <Style TargetType="DataGridRow" BasedOn="{StaticResource {x:Type DataGridRow}}"> <Setter Property="ContextMenu" Value="{StaticResource CtxDataGrid}" /> </Style> </DataGrid.RowStyle>
大家好,提前感谢您的宝贵时间。 我目前正在为我正在编写的一个小型商务应用程序使用 WPF 学习 MVVM。我读了很多关于MVVM模式的文章,发现......
我有一个 .NET 4.0 中的 WPF 解决方案,其中包括一个单元测试项目,该项目测试 ViewModel 中使用的不同命令。一切都工作正常,但后来我安装了.NET 4.5 和 VS2012....
我已经为我的应用程序创建了一个 WPF 自定义控件。我现在正在努力连接控件中某些控件的事件(ToggleButtons)。 我定义了以下内容: 窗头...
我是个菜鸟,所以请温柔点:) 我已经按照以下方式实现了异步验证:https:/web.archive.orgweb20190209072409http:/burnaftercoding.compostasynchronous-validation-with-wpf-4-...。
我试图创建一个用户控件。该用户控件将是一个显示加载器的Button,我试图从我的页面中传递一个绑定的命令到我的控件中。我试图从我的页面传递一个绑定命令到我的控件,我的XAML PAge是。
为什么WPF ApplicationCommands.Close命令在按钮和菜单项中被禁用?
问题 为什么WPF ApplicationCommands.Close命令在按钮和菜单项中被禁用?程式碼
我正在努力学习WPF并试图找出最佳做法。我了解基本的教程,但是它们通常不会涵盖更多的“复杂”行为。我的用例如下:用户...
我有一个WPF应用程序,带有一个绑定到MessageCommand的按钮。为了简单起见,该应用程序只有一个按钮,该按钮应显示一个消息框。但是,当我单击按钮时,...