2011-05-02 1380 views
0

如何向數據綁定菜單中的每個項目添加命令?基本上,我有這樣的事情:WPF:向數據綁定動態菜單中的每個MenuItem添加命令

 <MenuItem Header="View" ItemsSource="{Binding ...}" /> 

對菜單中的每一個項目,我需要給它基於其的DataContext的命令。由於模板位於生成的MenuItem容器中,因此我無法使用ItemTemplate。哦,這些命令需要輸入手勢,所以需要在菜單打開之前生成它們。

有沒有更好的方法來做到這一點?也許我應該添加/刪除代碼隱藏的項目?

+0

呃你能舉一個更好的例子嗎?我不完全明白你想要什麼 – 2011-05-02 10:25:13

+1

你可以嘗試使用CommandParameter屬性並將每個菜單項綁定到相同的命令。因此,您可以根據不同的參數使用執行事件。 – Howard 2011-05-02 10:41:16

+0

@霍華德 - 這比我接受的答案更清潔,但如何設置命令參數? – 2011-05-04 05:23:15

回答

1

請記住,MenuItem(和Menu)只是ItemsControls。這意味着你可以綁定任何東西的集合。換句話說,你可以將它綁定到任何具有ICommand的集合上(也就是你的viewmodel)。

但是我們不想要那個,我們想要MenuItems對嗎?所以你可以做的是讓你綁定到你在後臺創建的MenuItems集合的集合。

但是,如果我們能夠幫助它,我們真的不想讓控件在代碼隱藏中立即實現。它導致可測試性差並且基本上笨重。

所以,我們能做些什麼,而不是被綁定到你的樓內設有商務對象的集合,但使用custom TypeConverter到列表轉換成正確綁定到每個的MenuItems列表對象

請告訴我非常好的對這種做法是無論你的菜單結構有多深,它都可以工作。 Typeconverter可以走過你的視圖模型,並遞歸添加新的綁定,然後使用相同的類型轉換器

另一種選擇是爲菜單項viewmodel創建一個DataTemplate,該菜單項包含一個MenuItem,但我不完全確定如何用這種方法處理手勢。這可能是可能的,而且這種方法也是遞歸的。

+0

嗯...謝謝!我一直在使用ValueConverters,我完全忘記了類型轉換器...是的,我用MenuItem方法嘗試了DataTemplate,但由於它是菜單項中的菜單項,看起來很奇怪。 – 2011-05-04 05:22:14

+0

是的,我記得在某處讀到這可能是一個問題..你可能已經知道這個,但作爲參考,這裏是在代碼中創建綁定的HowTo頁面:http://msdn.microsoft.com/en-us/庫/ ms742863.aspx – aL3891 2011-05-04 08:02:17