簡體   English   中英

試圖綁定MenuItem的IsChecked屬性感到困惑

[英]Getting confused trying to bind IsChecked property of MenuItem

在StackOverflow和其他網站上瀏覽后,我發現人們在將屬性和命令綁定到MenuItemsContextMenus時遇到很多問題,因為ContextMenu不屬於WPF可視樹的一部分。 無論如何,我嘗試了幾種不同的解決方案,但沒有任何運氣。

我有一個MenuItem ,它是ContextMenu一部分。 ContextMenu是窗口的一部分,該窗口在其代碼中綁定到ViewModel,如下所示:

public partial class Window1 : Window
{
    public MainWindowViewModel ViewModel { get { return DataContext as MainWindowViewModel; } } 

    public Window1()
    {
        InitializeComponent();

        //There is a property in the App.xaml.cs file that refers to MainWindowViewModel
        DataContext = App.MainWindowViewModel = new MainWindowViewModel();
    }
}

我試圖綁定到MainWindowViewModel的屬性:

private bool _askBeforeDownloading_Checked = true;

public bool AskBeforeDownloading_Checked
{
    get { return _askBeforeDownloading_Checked; }
    set
    {
        _askBeforeDownloading_Checked = value;
        NotifyPropertyChange(() => AskBeforeDownloading_Checked);
    }
}

我目前在XAML中的嘗試:

<Button Name="Button_1" >
    <Button.ContextMenu>
        <ContextMenu x:Name="MainContextMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" >
            <MenuItem >
                <MenuItem IsCheckable="True" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.AskBeforeDownloading_Checked}" />
            </MenuItem>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

我根據有關該問題的公認答案以及本指南提出了當前的XAML。 我想念什么? 我沒有收到任何輸出錯誤,但是沒有檢查MenuItem 我沒有使用PlacementTarget做些什么?

更新:我認為重要的是要注意我的ContextMenuButton的子控件。 我已將其添加到我的XAML中。

更新2:在應用程序上使用Snoop之后,我發現我的Button會自動從MainWindowViewModel繼承。 但是,我忽略了可能影響我的代碼的父MenuItem 我已經更新了XAML,對於第一次丟失該文件表示歉意。

DataContext<ContextMenu>繼承而來,因此您無需在綁定中編寫任何特殊內容。

<Button Name="Button_1" >
    <Button.ContextMenu>
        <ContextMenu x:Name="MainContextMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" >
            <MenuItem IsCheckable="True" IsChecked="{Binding AskBeforeDownloading_Checked}" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

為了更詳細地說明, <ContextMenu>DataContext綁定說:

  • “ RelativeSource Self”表示“此項目”,它是<ContextMenu>
  • “ PlacementTarget”表示“放置該項目的項目”,在本例中為<Button>對象

因此,您要說的是將ContextMenu.DataContext屬性綁定到Button.DataContext屬性。

該屬性應該是MainWindowViewModel ,因此您可以只使用常規綁定來綁定到DataContext上的.AskBeforeDownloading_Checked屬性。

或者,您可以從<ContextMenu>刪除.DataContext綁定,並保持<MenuItem>綁定與您的綁定類似,但是您需要引用Button.DataContext.AskBeforeDownloading_Checked ,而不是Button.AskBeforeDownloading_Checked現在。

<Button Name="Button_1" >
    <Button.ContextMenu>
        <ContextMenu x:Name="MainContextMenu>
            <MenuItem IsCheckable="True" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.DataContext.AskBeforeDownloading_Checked}" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

在這兩種方法中,我更喜歡第一種方法,因為如果您將更多項目/屬性綁定到Button.DataContext屬性,它可以減少代碼。

您需要添加PlacementTarget.DataContext。 請參考下面的代碼。

<Button Name="Button_1" >
        <Button.ContextMenu>
            <ContextMenu x:Name="MainContextMenu">
                <MenuItem IsCheckable="True" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget.DataContext.AskBeforeDownloading_Checked}" />
            </ContextMenu>
        </Button.ContextMenu>
    </Button>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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