[英]How do you bind the checkmarks of submenus in a context menu defined externally?
在我們的應用程序中,我們有一個中央資源,其中我們定義了項目的所有系統級菜單。 這些菜單項已經綁定到對象的系統范圍定義的命令中。 例如,在應用程序中處理“ Foo”對象的任何地方,我們只需附加“ FooContextMenu”資源。 效果很好。
但是...其中一個菜單定義了代表枚舉值的子菜單,因此,我們希望根據對象上枚舉類型的屬性的值來檢查適當的菜單項。 例如,在用戶界面中顯示“ Foo”對象的任何地方,我們都希望顯示此上下文菜單...
FooContextMenu
|__First Foo command
|__Set Foo Encoding
| |__EnumValueA
| |__EnumValueB
| |__EnumValueC // <-- Show checkbox if 'Foo.SomeEnumProp' == 'C'
| |__EnumValueD
|__Other Foo command
|__Last Foo command
再一次,由於命令和上下文菜單資源是集中定義的,因此它們都可以很好地執行代碼。 我們無法確定的是如何全局處理該復選框。 盡管我們可以在各處添加“ ContextMenuOpening”代碼,但這就是問題所在。 我們必須在所有地方添加它,但是我無法想象這就是您必須這樣做的方式。
考慮到這是基本的Windows應用程序行為(實際上是任何操作系統),我肯定會丟失一些令人眼花obvious亂的東西,但是我只是看不到它。 (我想知道上下文菜單是否可以獲取它們所附加的項目的數據上下文,並且我可以進行簡單的綁定,但這只是一個猜測。)
ContextMenu
在DataContext
方面的行為有些不同。
<ContextMenu>
<MenuItem Header="Foo"
Command="{Binding FooCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItems}"/>
</ContextMenu>
ContextMenu
MenuItem
的DataContext
將是父項的DataContext
,后者是ViewModel,最有可能在上面的示例中公開ListBox.ItemsSource
綁定到的集合。
如果要直接使用在項目列表中表示的模型,則需要使用給定項目的相對路徑,如上面在CommandParamter
方案中所示。 如果只想使用ViewModel公開通用命令,則可以使用綁定,因為DataContext
將是表示項目列表的ViewModel。
特定於您的示例,如果您在ViewModel和Model之間保留常見行為,則可能看起來像這樣。
<ContextMenu>
<MenuItem Header="Foo">
<CheckBox
Visibility="{Binding Path=YourProperty,
Converter={StaticResource BooleanToVisibilityConverter}}">
My CheckBox
</CheckBox>
</MenuItem>
</ContextMenu>
然后,您可以將ViewModel內的屬性調出到Service,在此您將所有內容集中。 如果您需要模型來在轉換器中做出決定,則需要使用相對路徑來獲取SelectedItem
作為參數傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.