【问题标题】:one button click disable others button in wpf在wpf中单击一个按钮禁用其他按钮
【发布时间】:2014-08-28 16:01:42
【问题描述】:

我有一个应用程序有 2 个选项卡,即 A 和 B。两个选项卡都有 2 个按钮。除了标签之外还有1个确定按钮。 (参考截图)

我有 3 个视图模型,分别是 SampleApplicationTab ATab B 并进行绑定。

XAML 示例应用程序

  <DockPanel LastChildFill="True">
    <TabControl TabStripPlacement="Left" DockPanel.Dock="Left" Margin="5">
        <TabItem Width="190" Margin="1">
            <TabItem.Header>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Tab A" Margin="5,0,0,0" VerticalAlignment="Center" />
                </StackPanel>
            </TabItem.Header>
            <TabItem.ContentTemplate>
                <DataTemplate>
                    <ptab:TabA />
                </DataTemplate>
            </TabItem.ContentTemplate>
        </TabItem>
        <TabItem Margin="1">
            <TabItem.Header>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="TabB" Margin="5,0,0,0" VerticalAlignment="Center" />
                </StackPanel>
            </TabItem.Header>
            <TabItem.ContentTemplate>
                <DataTemplate>
                    <ptab:TabB />
                </DataTemplate>
            </TabItem.ContentTemplate>
        </TabItem>
    </TabControl>
</DockPanel>

示例应用程序视图模型

 public class SampleApplicationViewModel
{
    private TabAViewModel tabAViewModel;

    public TabAViewModel TabAVM 
    {
        get { return tabAViewModel; }
        set { tabAViewModel= value; }
    }

    private TabBViewModel tabBViewModel;

    public TabBViewModel TabBVM 
    {
        get { return tabBViewModel; }
        set { tabBViewModel= value; }
    }

    public MainViewModel()
    {
        tabAViewModel= new TabAViewModel();
        tabBViewModel= new TabBViewModel ();
    }
}

如何实现

  1. 当我单击选项卡 A 按钮 1 或 2 时,选项卡 B 和确定中的按钮将变为 禁用。
  2. 单击确定按钮时,选项卡 A 或 B 按钮将被禁用。
  3. 如果单击选项卡 B 按钮 1 或 2,选项卡 A 和确定按钮将被禁用。

*(禁用大约 5-10 秒,然后按钮将启用)

不使用棱镜框架等

【问题讨论】:

    标签: c# wpf design-patterns user-controls


    【解决方案1】:

    这里的问题是您错误地考虑了这个问题。问题不是“如何禁用这些按钮?”问题应该是“绑定的按钮的‘启用’状态是什么?”

    要让它工作,按钮命令处理程序需要设置一些变量(状态),导致其他按钮禁用。请注意,这意味着您的两个选项卡之间存在(可能是不受欢迎的)依赖关系,但根据您的要求,这可能是不可避免的。

    基本上,您需要让按钮看起来像:

    <Button IsEnabled="{Binding SomeProperty}" Command="{Binding SomeCommand}"/>
    

    其中“SomeProperty”由其他“SomeCommand”处理程序(对于其他按钮)调用的函数更改。

    希望这很清楚!如果您有任何问题,请告诉我。

    【讨论】:

    • 嗨@BradleyDotNET,我可以按照这个例子使用这种方法吗? codeproject.com/Articles/28081/…
    • 不,那篇文章解决了我在另一个答案中提出的问题。我尽可能避免使用静态类,所以除非必须,否则我不会使用这种方法。
    • 你好,将尝试您稍后提到的上述声明,谢谢您
    • 嗨@BradleyDotNET 这是我创建的示例的链接,请随时查看并帮助建议是否有任何方法可以改进或应用模式。 onedrive.live.com/?cid=233e2a690341bb1d
    【解决方案2】:

    如果您使用的是ICommand,您可以为其他按钮订阅CanExecuteChanged 事件,这样相关按钮就可以在各自的CanExecuteChanged 引发后启用自身。您必须在每个命令中添加一个CanExecuteChanged_Handler,以便在调用处理程序时您可以检查发件人是谁并更改其 canExecute 状态。

    【讨论】:

    • 这可能很难进行跨用户控制。我认为您走在正确的轨道上(有点),但这需要更多细节。此外,CanExecuteCanExecuteChanged 真的很难使用:(
    • @BradleyDotNET 我同意你的看法。他必须找到一个可以初始化这些 ICommand 的公共位置。
    • @berkeleyjuan 大家好,感谢您的回复,并会尽快更新答案xD
    猜你喜欢
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2015-03-28
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多