WPF custom command in context menu are disabled until any button clicked

后端 未结 4 944
无人及你
无人及你 2020-12-31 03:48

I have a custom command and I try to execute them from the context menu, but they are always displayed as disabled unless I click any button on the UI (buttons do not have a

4条回答
  •  感情败类
    2020-12-31 04:13

    This issue is due to the ContextMenu being on a separate Visual and Logical Tree to that of the Window and its Controls.

    For anyone still looking for an answer to this issue - After trawling the internet I have found the most effective answer to be to include the following in any declaration of a MenuItem that needs its commands to be heard by it's "owner".

    In layman's terms; if you want the commands of your context menu to be heard by the thing you're right clicking on. Add this code:

    CommandTarget="{Binding Path=PlacementTarget,
                            RelativeSource={RelativeSource AncestorType=ContextMenu}
                   }"
    

    Example:

        
            
        
    

    This will also work within Templates (something I found a lot of another solutions not to support). Here is an explanation of the meaning of the statement taken from elsewhere (I'm appalling at explaining things):

    Every FrameworkElement has a DataContext that is an arbitrary object. The default source for a data binding is that DataContext. You can use RelativeSource.Self to change the source for a binding to the FrameworkElement itself instead of its DataContext. So the RelativeSource part just moves you "up one level" from the DataContext of the FrameworkElement to the FrameworkElement itself. Once you are at the FrameworkElement you can specify a path to any of its properties. If the FrameworkElement is a Popup, it will have a PlacementTarget property that is the other FrameworkElement that the Popup is positioned relative to.

    In short, if you have a Popup placed relative to a TextBox for example, that expression sets the DataContext of the Popup to the TextBox and as a result {Binding Text} somewhere in the body of the Popup would bind to the text of the TextBox.

    I honestly hope that this information saves someone who's new to WPF the headache I've gone through this weekend... though it did teach me a lot!

提交回复
热议问题