无法访问父级的数据上下文

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}" />