【问题标题】:WPF RelyCommand binds but doesn't execute?WPF RelyCommand 绑定但不执行?
【发布时间】:2011-08-16 11:26:27
【问题描述】:

我有一个绑定到视图模型的命令,已启用,但并不总是执行。我该如何调试呢?我使用了 WPF Inspector,它重新确认绑定是正确的。

更多细节: 我有一个选项卡控件,它仅在未选择选项卡时执行关闭选项卡的命令。选择选项卡时,该命令将不会命中。

代码相当标准,我似乎看不到或调试探针。

TabItem 上的模板关闭按钮

                <Style x:Key="ClosableStyle" TargetType="telerik:RadTabItem">
                <Setter Property="HeaderTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>
                                <ContentControl Grid.Column="0" Content="{Binding DisplayName}"/>
                                <telerik:RadButton Grid.Column="1" Margin="3 1 -4 0" Width="16" Height="16" Opacity="0.7" Command="{Binding Path=CloseCommand}">
                                    <TextBlock Text="x" FontFamily="Arial Rounded MT" FontSize="12" Margin="0,-3,0,0" />
                                </telerik:RadButton>
                            </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

命令:

RelayCommand _closePanelCommand;
/// <summary>
/// Returns the command that, when invoked, attempts
/// to remove this workspace from the user interface.
/// </summary>
public virtual ICommand CloseCommand
{
    get
    {
        if (_closePanelCommand == null)
        {
            _closePanelCommand = new RelayCommand(
                () =>
                {
                    this.OnRequestClose();
                }
            );
        }

        return _closePanelCommand;
    }
}

【问题讨论】:

    标签: wpf mvvm command mvvm-light


    【解决方案1】:

    我还建议使用Snoop,它是一个 UI 调试实用程序,对于此类调试来说是必不可少的。否则你就瞎了。

    Button 的问题是,如果 Command 绑定失败(默默发生),Button 将保持启用状态,因此您不知道按钮是否已启用,因为 ICommand 这么说还是因为绑定失败的。

    您还可以查看输出窗口,它会告诉您绑定是否失败,但窥探比阅读输出窗口中的一堆文本要容易得多:)

    【讨论】:

      【解决方案2】:

      我猜你的问题是你试图将 ICommand 用作 INotifiableProperty ,它不会像这样工作。您需要在 ViewModel 的构造函数中为您的命令提供处理程序,如下所示 -

      this.CloseCommand= new RelayCommand(param => this.OnRequestClose(param));
      

      然后像这样写你的属性 -

      public ICommand CloseCommand { get; set; }
      

      【讨论】:

      • 这里的 'param' 是您想要与来自 xaml 的命令一起发送的任何命令参数。如果您不想要任何参数,您可以像在属性中一样声明。但我会参考使用这种语法。
      • 我认为问题被误解了。 OnRequestClose 在到达该行时起作用。 OnRequestClsor 取自 Josh Smiths 的 MVVM 示例,并且是相当的样板。
      • 您写道,有时您的命令不执行,您能否更具体地说明它不执行的情况,以及当您处理了如果您的 tabitem 不会触发您的命令的情况时,您能否提供代码被选中。可能会有所帮助
      【解决方案3】:

      您应该检查按钮的实际数据上下文(以 Snoop 为例)。我认为数据上下文不正确,以防您的命令未被触发。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多