gpt4 book ai didi

c# - 在 WPF 用户控件上实现 IsEnabled 属性

转载 作者:行者123 更新时间:2023-12-03 10:29:53 28 4
gpt4 key购买 nike

我已经构建了一个用户控件(ctlToolbarEdit),上面有一些按钮 - 但为了简单起见,我们假设有一个按钮:cmdSave。

我希望 ctlToolbarEdit 公开一个 IsSaveEnabled 属性,该属性在设置为 true 时设置 cmdSave.IsEnabled = true,并且(显然)在 false 设置为 cmdSave.IsEnabled = false 时。

最后,我希望能够绑定(bind)到该属性.. 我想将 IsSaveEnabled 绑定(bind)到 View Model 的 IsValid 属性,该表单托管控件的表单绑定(bind)到

所以。这是 ctlToolbarEdit 背后的代码

    private readonly DependencyProperty IsSaveEnabledProperty = DependencyProperty.Register("IsSaveEnabled", typeof(bool), typeof(ctlToolbarEdit));

public ctlToolbarEdit()
{
InitializeComponent();
}

public bool IsSaveEnabled
{
get { return (bool)GetValue(IsSaveEnabledProperty); }
set
{
SetValue(IsSaveEnabledProperty, value);
cmdSave.IsEnabled = value;
}
}

这是托管此用户控件的表单的 XAML:
<ctl:ctlToolbarEdit IsSaveEnabled="{Binding IsValid}" />

作为测试,我还将这行 XAML 添加到托管 ctlToolbarEdit 的表单中(因此它正在复制我试图产生的行为):
<Button Name="cmdSaveTest" Content="Save" IsEnabled="{Binding IsValid}" />

我的结果是这样的:
  • 我添加的按钮按预期工作。每当 IsValid 属性更改时,cmdSaveTest 按钮的 IsEnabled 值就会更改(我可以看到它启用/禁用)。这告诉我 IsValid 属性正在正确触发……换句话说,我可以绑定(bind)到该属性,所以我很高兴绑定(bind)到该属性和 View 模型都可以。
  • ctlToolbarEdit 中的 cmdSave 按钮不执行任何操作。

  • 事实上:我在 ctlToolbarEdit 的属性的 getter 和 setter 上放置了一些断点,这些似乎永远不会触发。

    谁能告诉我我忽略了什么痛苦的显而易见的事情?

    编辑

    典型的。你花了几个小时搜索,最后硬着头皮在 Stack Overflow 上发帖,几乎立刻就能找到可以回答你问题的东西。

    我现在知道:
  • 我的属性 getter 和 setter 被 CLR 忽略;它直接调用 GetValue 和 SetValue。这就是为什么我的断点没有被兑现(该代码实际上没有触发!)以及 cmdSave 的 IsEnabled 属性不起作用的原因。

  • 所以:这一切都说......那么我如何真正实现我想要实现的目标呢?帮助感激不尽。

    编辑

    好的......所以更多的进步;我看到你使用 PropertyMetadata。我补充说:
    , new PropertyMetadata(new PropertyChangedCallback(OnIsSaveEnabledChanged))

    到 IsSaveEnabledProperty DependencyProperty 语句(使其:
    private readonly DependencyProperty IsSaveEnabledProperty = DependencyProperty.Register("IsSaveEnabled", typeof(bool), typeof(ctlToolbarEdit), new PropertyMetadata(new PropertyChangedCallback(OnIsSaveEnabledChanged)));

    但是现在我需要编写的 OnIsSaveEnabledChanged 方法必须是“静态的”,并且我无法在该方法中访问 c​​mdSave。

    现在我真的被困住了。有什么帮助吗?

    DS

    最佳答案

    对于典型的 MVVM 模式,您可以反过来执行此操作:您的命令的 CanExecute/IsEnabled 属性将控制控件上的 IsEnabled 属性。因此,当您的 View 模型决定保存不可用时,它会导致您的命令的 CanExecute/IsEnabled 标志为假,并且使用该命令的任何控件都会禁用自己。例如,看看 Button 控件如何与 ICommand 一起工作。

    http://msdn.microsoft.com/en-us/library/ms752308.aspx

    http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx#sec10

    关于c# - 在 WPF 用户控件上实现 IsEnabled 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229577/

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