WPF RelyCommand связывает, но не выполняет? - PullRequest
0 голосов
/ 01 мая 2011

У меня есть команда, которая связывается с моделью представления, включена, но не всегда выполняется. Как я могу пойти на отладку этого? Я использовал 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;
    }
}

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Я также рекомендую использовать Snoop , которая является утилитой отладки пользовательского интерфейса, необходимой для такого рода отладки. В противном случае вы летите вслепую.

С Button дело в том, что если привязка Команды завершается неудачно (что происходит молча), Button остается включенной, поэтому вы не знаете, включена ли кнопка, потому что ICommand говорит об этом или потому что привязка не удалось.

Вы также можете посмотреть в своем окне вывода, которое должно сообщить вам, если привязка не удалась, но snoop немного проще, чем чтение набора текста в окне вывода:)

0 голосов
/ 02 мая 2011

вы должны проверить фактический текст данных вашей кнопки (возьмите Snoop). я думаю, что текстовые данные неверны, если ваша команда не будет запущена.

0 голосов
/ 01 мая 2011

Полагаю, что ваша проблема в том, что вы пытаетесь использовать ICommand в качестве INotifiableProperty, который не будет работать так.Вам нужно предоставить обработчик для вашей команды в конструкторе ViewModel примерно так -

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

И просто напишите свое свойство вот так -

public ICommand CloseCommand { get; set; }
...