2010-07-30 176 views
0

我正在使用MVVM light將View中的UIElements上的事件綁定到我的視圖模型中的ICommands,並且工作得非常好。MVVM Light:將事件綁定到後面代碼中的命令

但是 - 我有一種情況,我必須在運行中創建一些控件,並且在代碼背後的視圖中執行此操作,因爲這看起來是最好的地方,它畢竟是UI碼。當我在代碼中生成這些控件時,我還需要在代碼中創建事件綁定,並且儘管進行了多次嘗試,但我還沒有達到期望的結果。

有沒有人做過這個或做過任何人知道如何?

任何幫助表示讚賞!

+2

這不能回答你的問題,但你確定你需要在運行時生成控件嗎?同樣的事情可以通過數據模板來完成,可能還有觸發器或模板選擇器? – 2010-07-30 12:59:57

回答

0

我不知道MVVM Light,但假設您的viewmodel設置爲您的視圖的DataContext,至少有以下兩個選項。

  1. 如果您知道連接到您的視圖中的視圖模型的類型,你可以直接訪問該視圖模型的命令,也沒有必要使用綁定,你可以直接設置在Command屬性:

    var buttonA = new Button(); 
    buttonA.Content = "Click me"; 
    buttonA.Command = (DataContext as TheViewModel).TheCommand; 
    
  2. 如果你不知道,你可以創建通過以下方式綁定您的視圖模型的類型:

    var buttonB = new Button(); 
    buttonB.Content = "Click me too"; 
    var binding = new Binding("TheCommand"); 
    binding.Source = DataContext; 
    buttonB.SetBinding(Button.CommandProperty, binding); 
    
+0

我相信這個問題更多的是關於如何通過代碼而不是XAML來添加包含在MVVM Light Toolkit中的EventToCommand附加屬性。 – 2010-07-30 12:58:58

+0

我認爲你是對的。我想我的答案並沒有多大用處: - | – 2010-07-30 14:55:51

0

感謝您的回答和評論。馬特是正確的 - 問題是如何在代碼中使用EventToCommand而不是XAMl。馬特 - 我確實需要在運行時生成控件,因爲直到那時我才知道控件是什麼。控件位於功能區上,功能區與上下文相關,即每當更改主視圖時,功能區上的控件隨之更改並需要生成。

我發現了一個使用附加屬性的解決方案,但我仍然想知道MVVM Light是如何(以及如何)完成的。

+0

嗨肖恩 - 歡迎來到StackOverflow。您應該將此評論發佈爲對您的問題的修改 - 這是詳細說明,而不是答案,它屬於您的原始問題。然而,關於您的評論,仍然有可能通過純Xaml和巧妙使用數據模板在功能區上生成上下文敏感的更改。我建議不要在代碼中這樣做,因爲它限制了您的靈活性,並使Xaml更緊密地綁定到它的代碼隱藏(這在WPF中很少需要做)。 – 2010-08-05 06:53:55

+0

如果您編輯您的原始問題以詢問如何完成這些工作,我肯定會有人回答(可惜我現在還沒有時間,但我稍後會回來檢查!)。 – 2010-08-05 06:54:13