2010-01-27 84 views
0

我有幾個MenuItems的命令綁定到我的ViewModel。直到今天,所有這些都正確執行。數據綁定到動態加載插件的功能

現在我添加了一個MenuItem,其ItemsSource綁定到ObservableCollection。這個MenuItem的目的是枚舉一個插件列表,以便顯示所有插件的名稱。然後當用戶點擊一個插件名稱時,它應該調用一個函數來顯示音頻過濾器的屬性。

在我目前的執行,這是不行的,我想數據綁定這樣的:

<MenuItem Header="Filters" ItemsSource="{Binding FilterPluginNames}"> 
    <MenuItem.ItemContainerStyle> 
     <Style> 
      <Setter Property="MenuItem.Command" Value="{Binding ShowFilterDialogCommand}" /> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 

的問題是,我得到一個BindingExpression路徑錯誤,因爲它試圖用一個字符串作爲菜單項的DataContext的。

這使我相信MenuItem的MenuItems的DataContext被自動設置爲ItemsSource中的對象類型。這是真的?

如果我需要更改DataContext,那麼我想將其更改爲處理所有其他命令的ViewModel。但是如果我這樣做了,我怎麼能夠知道我想要顯示哪些插件的過濾器屬性?我至少需要傳入CommandParameter,但將此值綁定到過濾器名稱並不是我最喜歡的選項。有沒有其他方法可以做到這一點?

如果DataContext確實自動設置爲ObservableCollection中的對象類型,那麼我寧願直接調用我的接口方法ShowFilterProperties()。我敢打賭,如果沒有命令綁定,我無法做到這一點。如果是這樣的話,你們如何處理這種應用?你是否讓所有的插件暴露了一個命令處理程序,然後將顯示對話框?

編輯 - 我修改代碼來改變的ObservableCollection類型,果然,WPF想要所以我想一個選擇是有插件暴露ICommand的數據綁定到類型T,但我不」不知道這是不是一個奇怪的方法?

編輯 - 好的,我剛學到了一些新東西。接口不能有字段,那麼是不是可以使用插件進行數據綁定?

+0

他們不能有字段,但他們可以有屬性;-)。另外,插件並不是一個明確定義的術語。如果你認爲這很重要,你能解釋一下你的意思嗎? – 2010-01-27 17:50:21

回答

1

你可能不像你想像的那樣具有約束力。您可能只需在綁定中添加一些診斷信息並查看它們綁定的對象。這裏是一個很好的鏈接進行調試綁定:

http://www.beacosta.com/blog/?p=52

這裏有一個例子:

<Window … 
    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
    /> 

    <TextBlock Text="{Binding Path=Caption, diagnostics:PresentationTraceSources.TraceLevel=High}" … /> 

我覺得你的做法是正確的...它可能只是需要調試一點。

+0

感謝您的提示!我將檢查綁定調試提示的鏈接。我總是可以在這方面使用一些技巧。 :) – Dave 2010-01-27 23:16:29