Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF RelyCommand绑定但不';不执行?_Wpf_Mvvm_Command_Mvvm Light - Fatal编程技术网

WPF RelyCommand绑定但不';不执行?

WPF RelyCommand绑定但不';不执行?,wpf,mvvm,command,mvvm-light,Wpf,Mvvm,Command,Mvvm Light,我有一个绑定到视图模型的命令,该命令已启用,但并不总是执行。我如何进行调试?我使用了WPF检查器,它再次确认绑定是正确的 更多详情: 我有一个选项卡控件,它仅在未选择选项卡时执行关闭选项卡的命令。选择选项卡后,命令将不会命中 代码相当标准,我似乎无法看到或调试问题 选项卡项上的模板化关闭按钮 <Style x:Key="ClosableStyle" TargetType="telerik:RadTabItem"> <

我有一个绑定到视图模型的命令,该命令已启用,但并不总是执行。我如何进行调试?我使用了WPF检查器,它再次确认绑定是正确的

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

代码相当标准,我似乎无法看到或调试问题

选项卡项上的模板化关闭按钮

                <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;
    }
}
RelayCommand\u closepanel命令;
/// 
///返回调用时尝试执行的命令
///从用户界面中删除此工作区。
/// 
公共虚拟ICommand CloseCommand
{
得到
{
如果(_closePanelCommand==null)
{
_closePanelCommand=新的RelayCommand(
() =>
{
这个.OnRequestClose();
}
);
}
返回_closepanel命令;
}
}

我想您的问题是,您试图将ICommand用作INotifiableProperty,但这样做行不通。您需要在ViewModel的构造函数中为您的命令提供如下处理程序-

this.CloseCommand= new RelayCommand(param => this.OnRequestClose(param));
public ICommand CloseCommand { get; set; }
把你的财产写成这样-

this.CloseCommand= new RelayCommand(param => this.OnRequestClose(param));
public ICommand CloseCommand { get; set; }

您应该检查按钮的实际数据上下文(使用Snoop)。我认为,如果您的命令没有被触发,datacontext是不正确的。

我还建议使用它,这是一个UI调试实用程序,对于这种调试是必不可少的。否则你就瞎飞了

按钮
的问题是,如果命令绑定失败(默认情况下发生),
按钮
将保持启用状态,因此您不知道该按钮是因为
ICommand
这样说还是因为绑定失败而启用的


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

这里的“param”是您希望从xaml随命令发送的任何commandparameter。如果您不需要任何参数,可以像在属性中那样声明。但我会提到使用这种语法。我认为这个问题被误解了。OnRequestClose在到达该行时工作。OnRequestClsor取自Josh Smith的MVVM示例,非常简单。您曾写道,有时您的命令无法执行,您能否更具体地说明它无法执行的情况,以及当您处理了如果选择了tabitem命令将无法启动的情况时,您能否提供代码。也许这会有所帮助