[英]Getting confused trying to bind IsChecked property of MenuItem
在StackOverflow和其他網站上瀏覽后,我發現人們在將屬性和命令綁定到MenuItems
和ContextMenus
時遇到很多問題,因為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
做些什么?
更新:我認為重要的是要注意我的ContextMenu
是Button
的子控件。 我已將其添加到我的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
綁定說:
<ContextMenu>
<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.