我有一个绑定到视图模型的命令,已启用,但并不总是执行。我该如何调试呢?我使用了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;
}
}
答案 0 :(得分:1)
我还建议使用Snoop这是一个UI调试实用程序,对于这种调试至关重要。否则你会失明。
具有Button
的东西是,如果Command绑定失败(静默发生),Button
保持启用状态,因此您不知道该按钮是否已启用,因为ICommand
这么说或者因为绑定失败了。
您还可以查看输出窗口,该窗口应该告诉您绑定是否失败,但是snoop比读取输出窗口中的一堆文本要容易得多:)
答案 1 :(得分:0)
我猜你的问题是你试图使用ICommand作为INotifiableProperty,它不会像这样工作。您需要在ViewModel的构造函数中为您的命令提供类似的处理程序 -
this.CloseCommand= new RelayCommand(param => this.OnRequestClose(param));
就这样写你的财产 -
public ICommand CloseCommand { get; set; }
答案 2 :(得分:0)
你应该检查按钮的实际datacontext(采用Snoop)。我认为如果你的命令没有被触发,那么datacontext就不对了。