无法访问父级的数据上下文
Can't access datacontext of parent
基本上我有一个带上下文菜单的列表框
<ListBox Margin="2,0,0,0" Grid.Row="1" ItemsSource="{Binding MyCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<Button Style="{StaticResource NoVisualButton }" Tag="{Binding ID}" Width="430" toolkit:TiltEffect.IsTiltEnabled="True" Margin="0,0,0,12" Click="OnSelectWorkOutItemClick">
<StackPanel>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="delete" Tag="{Binding ID}" Click="onContextMenuDeleteItemClick" IsEnabled="{Binding IsDeleteOptionEnable, ElementName=LayoutRoot}"/>
<toolkit:MenuItem Header="edit" Tag="{Binding ID}" Click="onContextMenuItemEditClick" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
...
</StackPanel>
</Button>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
因此,如果 MyCollection 只有一项,我必须禁用删除 MenuItem。
我的模型有 属性
public bool IsDeleteOptionEnable
{
get
{
return MyCollection.Count() >= 2;
}
}
在页面中,我将 DataContext 设置为:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (IsDataLoaded)
{
this.DataContext =MyModel;
}
}
列表框正在填充,但我无法禁用 "delete" MenuItem。我做错了什么?
尝试
IsEnabled="{Binding DataContext.IsDeleteOptionEnable, ElementName=LayoutRoot}"
由于 IsDeleteOptionEnable 是常规 属性,因此当 属性 更改时您的视图不会收到通知。选项将在您的模型中实现 INotifyPropertyChanged(实际上应该是 MVVM 模式中的 ViewModel),并在集合中的项目发生更改时调用 PropertyChanged 事件。
class YourModel : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
..
..
public YourModel() {
this.MyCollection = ...;
this.MyCollection.CollectionChanged += MyCollection_CollectionChanged;
}
public bool IsDeleteOptionEnable {
get {
return MyCollection.Count() >= 2;
}
}
private void MyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
this.OnPropertyChanged("IsDeleteOptionEnable");
}
private void OnPropertyChanged(string name = null) {
if (this.PropertyChanged != null) {
PropertyChangedEventArgs ea = new PropertyChangedEventArgs(name);
this.PropertyChanged(this, ea);
}
}
}
现在,当一个项目被删除或添加到集合中时,模型会引发 PropertyChanged 事件,以便视图会知道 IsDeleteOptionEnable 属性 已(实际上可能)已更改,并且启用状态按钮得到更新。
作为DataSource
你需要使用ObservableCollection
。然后你需要在 class 中实现 INotifyPropertyChanged
-接口,其中包含绑定的 Property
.
示例Class:
// Example of binded object
public class MyItem: INotifyPropertyChanged {
// Binded Property
private String itemIsVisible = "Yes";
public String ItemIsVisible{
get { return itemIsVisible; }
set {
itemIsVisible = value;
// This ensures the updating
OnPropertyChanged("ItemIsVisible");
}
}
protected void OnPropertyChanged(string name) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(name));
}
}
}
示例XAML:
<TextBlock Text="{Binding ItemIsVisible}" />
基本上我有一个带上下文菜单的列表框
<ListBox Margin="2,0,0,0" Grid.Row="1" ItemsSource="{Binding MyCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<Button Style="{StaticResource NoVisualButton }" Tag="{Binding ID}" Width="430" toolkit:TiltEffect.IsTiltEnabled="True" Margin="0,0,0,12" Click="OnSelectWorkOutItemClick">
<StackPanel>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="delete" Tag="{Binding ID}" Click="onContextMenuDeleteItemClick" IsEnabled="{Binding IsDeleteOptionEnable, ElementName=LayoutRoot}"/>
<toolkit:MenuItem Header="edit" Tag="{Binding ID}" Click="onContextMenuItemEditClick" />
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
...
</StackPanel>
</Button>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
因此,如果 MyCollection 只有一项,我必须禁用删除 MenuItem。
我的模型有 属性
public bool IsDeleteOptionEnable
{
get
{
return MyCollection.Count() >= 2;
}
}
在页面中,我将 DataContext 设置为:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (IsDataLoaded)
{
this.DataContext =MyModel;
}
}
列表框正在填充,但我无法禁用 "delete" MenuItem。我做错了什么?
尝试
IsEnabled="{Binding DataContext.IsDeleteOptionEnable, ElementName=LayoutRoot}"
由于 IsDeleteOptionEnable 是常规 属性,因此当 属性 更改时您的视图不会收到通知。选项将在您的模型中实现 INotifyPropertyChanged(实际上应该是 MVVM 模式中的 ViewModel),并在集合中的项目发生更改时调用 PropertyChanged 事件。
class YourModel : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
..
..
public YourModel() {
this.MyCollection = ...;
this.MyCollection.CollectionChanged += MyCollection_CollectionChanged;
}
public bool IsDeleteOptionEnable {
get {
return MyCollection.Count() >= 2;
}
}
private void MyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {
this.OnPropertyChanged("IsDeleteOptionEnable");
}
private void OnPropertyChanged(string name = null) {
if (this.PropertyChanged != null) {
PropertyChangedEventArgs ea = new PropertyChangedEventArgs(name);
this.PropertyChanged(this, ea);
}
}
}
现在,当一个项目被删除或添加到集合中时,模型会引发 PropertyChanged 事件,以便视图会知道 IsDeleteOptionEnable 属性 已(实际上可能)已更改,并且启用状态按钮得到更新。
作为DataSource
你需要使用ObservableCollection
。然后你需要在 class 中实现 INotifyPropertyChanged
-接口,其中包含绑定的 Property
.
示例Class:
// Example of binded object
public class MyItem: INotifyPropertyChanged {
// Binded Property
private String itemIsVisible = "Yes";
public String ItemIsVisible{
get { return itemIsVisible; }
set {
itemIsVisible = value;
// This ensures the updating
OnPropertyChanged("ItemIsVisible");
}
}
protected void OnPropertyChanged(string name) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) {
handler(this, new PropertyChangedEventArgs(name));
}
}
}
示例XAML:
<TextBlock Text="{Binding ItemIsVisible}" />