Кнопка (и) KeyBinding [MVVM] - PullRequest
       2

Кнопка (и) KeyBinding [MVVM]

0 голосов
/ 01 августа 2011

Я изо всех сил пытаюсь привязать некоторые клавиши быстрого доступа к моим кнопкам WPF. Кнопки создаются динамически с помощью следующего кода [только фрагмент - но этого должно быть достаточно]:

// for each command defined in the database
... 
PosCommand cmd = null; // FYI: PosCommand implements ICommand
if (!string.IsNullOrEmpty(group.AssemblyPath))
{
    if (System.IO.File.Exists(group.AssemblyPath))
    cmd = (PosCommand)Activator.CreateInstance(Assembly.LoadFile(group.AssemblyPath).GetType(group.FullQualifiedName), model);
}
else
{
cmd = (PosCommand)Activator.CreateInstance(Assembly.GetExecutingAssembly().GetType(group.FullQualifiedName), model);
}
if (cmd == null)
continue;

Function function = new Function()
{
Command = cmd,
Name = group.FunctionName,
Description = group.Description,
FunctionCode = group.FunctionCode
};
...

Вот фрагмент кода XAML, который связывается с кодом C #:

<itemscontrol x:name="functionList" grid.row="0" itemssource="{Binding GroupFunctions}" xmlns:x="#unknown">
    <itemscontrol.itemtemplate>
        <datatemplate>
            <groupbox header="{Binding Group}">
                <itemscontrol scrollviewer.horizontalscrollbarvisibility="Disabled" itemssource="{Binding Functions}">
                    <itemscontrol.itemspanel>
                        <itemspaneltemplate>
                            <wrappanel />
                        </itemspaneltemplate>
                    </itemscontrol.itemspanel>
                    <itemscontrol.itemtemplate>
                        <datatemplate>
                            <Button MinWidth="91" Height="50" Content="{Binding Name}" ToolTip="{Binding Description}" Command="{Binding Command}"/> 
                        </datatemplate>
                    </itemscontrol.itemtemplate>
                </itemscontrol>
            </groupbox>
        </datatemplate>
    </itemscontrol.itemtemplate>
</itemscontrol>

Я безуспешно пытался добавить какую-то привязку к кнопке ?! Я изменил класс Function так, чтобы он содержал свойства для Модификатора и Ключа, конечно же, для каждой из кнопок. Это все еще не хочет работать, даже если я жестко закодирую значения Модификатора и Ключа ??

<Button.InputBindings>
    <keybinding modifiers="{Binding Mod}" key="{MyKey}" />
</Button.InputBindings>

Может ли кто-нибудь помочь мне в этом вопросе? Большое спасибо заранее!

С уважением,

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Я бы предложил использовать System.Windows.Interactivity с пользовательским триггером.У меня есть пример в моем блоге , сделанный для платформы Caliburn Micro MVVM, но я думаю, что это решение для кросс-фреймворка.System.Windows.Interactivity.dll является частью Blend, но его можно распространять в двоичном виде, не требует специальной настройки, достаточно лишь развертывания xcopy.

0 голосов
/ 01 ноября 2011

В конце дня я написал свой собственный ключевой слушатель. Я обработал KeyEventHandler:

protected override void OnInitialized(EventArgs e)
{            
    base.OnInitialized(e);

    this.AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent);
}

private void HandleKeyDownEvent(object sender, KeyEventArgs e)
{

}

По сути, все ICommands определены в базе данных и создаются динамически. Таким образом, я использовал CommandProperty для добавления сложного типа данных. В этом сложном типе данных я храню различную информацию, включая использование клавиши быстрого доступа. Таким образом, прослушиватель ключей ожидает комбинации клавиш, ищет их и выполняет ICommand.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...