2011-08-01 50 views
0

我正在努力將一些捷徑鍵綁定到我的WPF按鈕。的按鈕是動態建立通過使用以下代碼[只有一個片段 - ,但應足以]:Button(s)KeyBinding [MVVM]

// 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 
}; 
... 

這裏是結合到C#代碼的XAML的一個片段:

<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類,以便它包含Modifier和Key的屬性,當然每個按鈕都是這樣。它仍然不想工作,即使我對Modifier和Key值進行了硬編碼

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

請問誰能幫我解決這個問題? 非常感謝提前!

親切的問候,

回答

0

在一天結束時,我寫了我自己的關鍵聽衆。我處理的KeyEventHandler

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

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

private void HandleKeyDownEvent(object sender, KeyEventArgs e) 
{ 

} 

基本上,所有的個ICommand的是數據庫中的定義,並動態地建立起來。因此,我使用CommandProperty來添加一個複雜的數據類型。在這個複雜的數據類型中,我存儲了各種信息,包括使用的快捷鍵。因此,關鍵偵聽器等待鍵組合,查找並執行ICommand。

親切的問候,

1

我會建議使用System.Windows.Interactivity一個自定義觸發。我有一個example here on my blog,用於Caliburn Micro MVVM框架,但我認爲它是一個跨框架解決方案。 System.Windows.Interactivity.dll是Blend的一部分,但它以二進制形式可再發行,它不需要任何特殊設置,只需xcopy部署就足夠了。

+0

嗨費利斯,非常感謝您的答覆。我會試一試,讓你知道!親切的問候 –

+0

這比在編寫每個UI組件的代碼背後編寫處理程序更可重用 –