簡體   English   中英

如何在外部定義的上下文菜單中綁定子菜單的復選標記?

[英]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亂的東西,但是我只是看不到它。 (我想知道上下文菜單是否可以獲取它們所附加的項目的數據上下文,並且我可以進行簡單的綁定,但這只是一個猜測。)

ContextMenuDataContext方面的行為有些不同。

<ContextMenu>
      <MenuItem Header="Foo" 
                Command="{Binding FooCommand}" 
                CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.SelectedItems}"/>
</ContextMenu>

ContextMenu MenuItemDataContext將是父項的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM