WPF CommandBinding НЕ на элементе верхнего уровня / Window / this - PullRequest
0 голосов
/ 21 июня 2010

Все, что я хотел, - это разные привязки на разных вкладках, поэтому переключение вкладок переключало бы доступность команд.Я думал, что CommandBindings работает таким образом.

Но я потратил последнее время, пытаясь заставить этот простой пример работать.Либо я в корне неправильно понимаю (и это не будет первым), либо что-то не так.

Я добавляю CommandBinding к textBoxA, но НЕ к textBoxB.Перемещение между ними должно включать и отключать кнопку, для которой установлена ​​соответствующая команда.

Добавление привязки Command к окну просто прекрасно активирует кнопку, но этот тип убивает весь смысл привязанных к элементам CommandBindings.

Использование этого XAML

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="500">
    <Canvas>
        <Button Canvas.Left="31" Canvas.Top="24" Content="Click Me" Name="button1" Width="100"/>
        <TextBox Canvas.Left="155" Canvas.Top="22" Height="23" Name="textBoxA" Width="120" Text="A" />
        <TextBox Canvas.Left="298" Canvas.Top="22" Height="23" Name="textBoxB" Width="120" Text="B" />
    </Canvas>
</Window>

Использование этого кода

public MainWindow()
{
    InitializeComponent();

    button1.Command = ApplicationCommands.Open;

    var _Binding = new CommandBinding(button1.Command);
    textBoxA.CommandBindings.Add(_Binding);
    textBoxB.CommandBindings.Clear(); // nothing bound

    _Binding.CanExecute += (s, e) =>
    {
        e.CanExecute = true;
    };

    _Binding.Executed += (s, e) =>
    {
        MessageBox.Show("Hello");
    };
}

Вы увидите (если вы попробуете этот код), что кнопка остается отключенной, даже если выперейти от одного текстового поля к другому.(Несмотря на то, что textBoxA должен включить кнопку, потому что она реализует CommandBinding кнопки).

Как это должно работать?

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 21 июня 2010

Я попытаюсь выяснить, смогу ли я выполнить ваш сценарий:

<Canvas>
    <Button ... Command="Open">
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </Button>
    <TextBox ... >
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </TextBox>
    <TextBox ... />
</Canvas>

А в коде позади:

private void OnOpen(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Hello");
}

Идея для CommandBindings состоит в том, чтобывырезать для того, чтобы обычные нажатия клавиш работали между кнопками и другими элементами управления в контексте (обычно пользовательский контроль).Тогда каждая область может иметь разные значения для команды Open (возможно, один откроет файл - в другом откроется элемент, выбранный в ListView и т. Д.).

В моем примере - нажатие клавиш CTRL + Oв то время как TextBox A или кнопка имеет фокус, вызовет MessageBox «Hello».Но прочитайте страницу, на которую ссылается Leom, для более глубокого объяснения.

0 голосов
/ 09 марта 2011

MSFT дал мне правильный ответ на своем форуме WPF, здесь http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/bb3d1eb1-96fa-4fbc-beda-799613acb9f7

0 голосов
/ 21 июня 2010

Я не вижу, как это будет работать, и кажется, что вы упустили извинение (извините) - CommandBindings должны применяться к родительским элементам (размещение на холсте также будет работать).Когда кнопка нажата, RoutedCommand будет «всплывать» через визуальное дерево, что означает, что любые родительские элементы будут иметь свои события, связанные с этой командой.Причина, по которой кнопка остается отключенной, заключается в том, что вы не можете выполнить команду открытия в этой точке, а привязка CommandBinding не оценивается, поскольку она не находится в пути выполнения.см. здесь:

http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

...