Как привязать команду кнопки к команде главного окна - PullRequest
2 голосов
/ 06 ноября 2011

Я пытаюсь привязать кнопку в пользовательском элементе управления к команде, определенной в главном окне моих приложений. Просто не могу заставить его работать. Метод CanExecute никогда не вызывается, как и код при нажатии кнопки.

MainWindow.xaml

<Window.CommandBindings>
    <CommandBinding x:Name="RefreshCommand" 
                    Command="AppCommands:DataCommands.Refresh"
                    Executed="Refresh_Executed"
                    CanExecute="Refresh_CanExecute" />
</Window.CommandBindings>

<uc:Toolbar x:Name="MainToolbar" Grid.Row="0" RefreshCommand="{Binding RefreshCommand}"/>

MainWindow.xaml.cs

private void Refresh_Executed(object sender, ExecutedRoutedEventArgs e)
{

}

private void Refresh_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = false;
}

Дополнительно это делается в конструкторе MainWindow ...

MainToolbar.DataContext = this;

Toolbar.xaml

<Button x:Name="btnRefresh" Command="{Binding RefreshCommand, ElementName=ToolbarControl}">Refresh</Button>

Toolbar.xaml.cs

#region Command Bindings


public static readonly DependencyProperty RefreshCommandProperty =
            DependencyProperty.Register("RefreshCommand", typeof(ICommand), typeof(Toolbar), new UIPropertyMetadata(null));

public ICommand RefreshCommand
{
    get { return (ICommand)GetValue(RefreshCommandProperty); }
    set { SetValue(RefreshCommandProperty, value); }
}

#endregion

Если кто-нибудь может понять, почему это не работает, это будет оценено. Я думаю, что у меня все в порядке. Тем не менее, я установил точки останова на мои обработчики событий для команды кнопки в главном окне, и они просто не вызывают. Единственная путаница в моем файле MainWindow.xaml, использую ли я правильное выражение привязки для привязки свойства пользовательских элементов управления к моей фактической команде?

Примечание. В настоящее время CanExecute имеет значение false, поскольку я хочу сначала отключить кнопку (но это также не работает).

Обновление: Это явно источник проблемы ...

System.Windows.Data Error: 40 : BindingExpression path error: 'RefreshCommand' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=RefreshCommand; DataItem='MainWindow' (Name=''); target element is 'Toolbar' (Name='MainToolbar'); target property is 'RefreshCommand' (type 'ICommand')

... но как это исправить?

1 Ответ

1 голос
/ 06 ноября 2011

Ваша цель ElementName неверна.

<Button x:Name="btnRefresh" Command="{Binding RefreshCommand, ElementName=ToolbarControl}">Refresh</Button> 

исправить выше, как показано ниже ...

<Button x:Name="btnRefresh" Command="{Binding RefreshCommand, ElementName=MainToolbar}">Refresh</Button> 

ElementName должно быть значением x: Name или Name.

- РЕДАКТИРОВАТЬ (вышеуказанные коды неверно указаны) -

Как вы знаете, при взаимодействии Элемент-с-элементом в Xaml ElementName должен быть определен.

Команда RefreshCommand MainToolbar в MainWindow.xaml должна быть привязана к x: Name в CommandBinding.Другими словами, вы не указали имя элемента, поэтому цель привязки указана неправильно.

Попробуйте приведенный ниже код.

<uc:Toolbar x:Name="MainToolbar" Grid.Row="0" RefreshCommand="{Binding ElementName=RefreshCommand, Path=Command}"/> 
...