【问题标题】:Change xaml properties with commands使用命令更改 xaml 属性
【发布时间】:2017-06-29 16:16:36
【问题描述】:

我想用命令打开和关闭 splitview.pane。这是我的示例 xaml 代码:

<SplitView Name="AppNavigation" DisplayMode="CompactOverlay" IsPaneOpen="False" CompactPaneLength="50" OpenPaneLength="200">
    <SplitView.Pane>
        <Button Name="Hamburger" FontFamily="Segoe MDL2 Assets" Content="&#xE700;" FontSize="24" Width="50" Height="50" Command="{Binding HamburgerExecute}" />
    </SplitView.Pane>
</SplitView>

我使用一个 RelayCommand 类并调用这两个方法:

    private bool HamburgerCanExecute(object obj)
    {
        return true;
    }

    private void HamburgerExecute(object obj)
    {
        AppNavigation.IsPaneOpen = !AppNavigation.IsPaneOpen; // this doesn't work
    }

谁能向我解释我如何使用命令来更改 xaml 属性?

【问题讨论】:

  • 你试过调试代码吗?程序输入你的命令了吗?当您使用绑定时 - 您是否设置了数据上下文?
  • How to bind WPF button to a command in ViewModelBase? 的可能重复项 不完全是重复项,但归结为同一个问题。 (如何绑定命令)
  • 你说你使用了一个RelayCommand 类,我假设它实现了ICommand。你绑定到这个命令吗?看起来你绑定到一个方法。

标签: c# xaml mvvm uwp


【解决方案1】:

我忘了集成 UI 命名空间...该死的

所以正确的代码是:

private void HamburgerExecute(object obj)
{
    SplitView navigation = obj as SplitView;
    navigation.IsPaneOpen = !navigation.IsPaneOpen;
}

和我的 xaml 文件中的 CommandParameter:

<SplitView Name="AppNavigation" DisplayMode="CompactOverlay" IsPaneOpen="False" CompactPaneLength="50" OpenPaneLength="200">
    <SplitView.Pane>
        <Button Name="Hamburger" FontFamily="Segoe MDL2 Assets" Content="&#xE700;" FontSize="24" Width="50" Height="50" Command="{Binding HamburgerCommand}" CommandParameter="{Binding ElementName=AppNavigation}" />
    </SplitView.Pane>
</SplitView>

【讨论】:

    【解决方案2】:

    看起来您直接将该方法绑定到您的Button,但您声明您正在使用RelayCommand。请确保您绑定的是RelayCommand,而不是实际的方法。

    希望对你有帮助!

    【讨论】:

    • 谢谢这仍然是一个错误,但我现在如何操作 IsPaneOpen? AppNavigation 在此上下文中是未知的。
    【解决方案3】:

    在您的按钮中创建一个点击事件。

    <SplitView Name="AppNavigation" DisplayMode="CompactOverlay" IsPaneOpen="False" CompactPaneLength="50" OpenPaneLength="200">
    <SplitView.Pane>
        <Button Name="Hamburger" FontFamily="Segoe MDL2 Assets" Content="&#xE700;" FontSize="24" Width="50" Height="50" Click="Hamburger_Click />
    </SplitView.Pane>
    

    C#:

    private void Hamburger_Click(object sender, RoutedEventArgs e)
        {
            AppNavigation.IsPaneOpen = !AppNavigation.IsPaneOpen;
        }
    

    【讨论】:

    • 感谢您的回答,但我想使用命令和 mvvm 模式。因此,代码隐藏中的点击事件对我来说不是一个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 2017-11-08
    • 2014-06-21
    • 1970-01-01
    相关资源
    最近更新 更多