如何通知完全依赖于ObservableCollection的绑定属性的更改

本文关键字:ObservableCollection 绑定 属性 依赖于 何通知 通知 | 更新日期: 2023-09-27 18:06:50

我在类Foo上有一个绑定属性,其定义如下(为清晰起见进行了编辑),

public class Foo : INotifyPropertyChanged
{
    public Foo()
    {
        // This should notify when IsHidden changes?
        MyApp.ViewModel.HiddenCategories.CollectionChanged += (s, e) => {
            this.NotifyPropertyChanged("IsHidden");
        };
    }
    public CategoryId Category { get; set; }
    // IsHidden depends on a `global' ObservableCollection object on the ViewModel
    public bool IsHidden 
    {
        get { return MyApp.ViewModel.HiddenCategories.Contains(this.Category); }
    }
    // IsHidden is toggled by adjusting the global ObservableCollection - how to notify the UI? 
    public void ToggleHidden()
    {
        if (this.IsHidden)
            MyApp.ViewModel.HiddenCategories.Remove(this.Category);
        else
            MyApp.ViewModel.HiddenCategories.Add(this.Category);
    }
    #region INotifyPropertyChanged members
    ...
}

ViewModel有以下定义

public class FooRegion
{
    public string RegionName { get; set; }
    // Foos is bound in the top ListBox DataTemplate 
    // Each Foo has properties bound in the sub ListBox DataTemplate
    public ObservableCollection<Foo> Foos { get; set; }
}
// This is actually what is bound to the top level ListBox
public ObservableCollection<FooRegion> FoosByRegion { get; set; }
public ObservableCollection<CategoryId> HiddenCategories { get; set; }

我的XAML在资源中定义了两个ItemTemplates,如下所示,

<phone:PhoneApplicationPage.Resources>
...
<DataTemplate x:Key="MainItemTemplate">
    <StackPanel >
        <TextBlock Text="{Binding Name}"/>
        <ListBox ItemsSource="{Binding Foos}"  
            ItemTemplate="{StaticResource SubItemTemplate}" />
    </StackPanel>
</DataTemplate>
... 
<DataTemplate x:Key="SubItemTemplate">
    <StackPanel  Opacity="{Binding IsHidden, Converter={StaticResource BoolToOpacity}}" >
        <toolkit:ContextMenuService.ContextMenu>
            <toolkit:ContextMenu>
                <toolkit:MenuItem Header="{Binding IsHidden, ConverterParameter=unhide foo|hide foo, 
                    Converter={StaticResource BoolToStrings}}" Tap="toggleHideFooContextMenuItem_Tap" />
            </toolkit:ContextMenu>
        </toolkit:ContextMenuService.ContextMenu>
        <TextBlock Text="Some Text Here"/>
    </StackPanel>
</DataTemplate>
...
</phone:PhoneApplicationPage.Resources>

这些资源被调用到'嵌套' ListBox中,如下所示:

<ListBox ItemTemplate="{StaticResource MainItemTemplate}" ItemsSource="{Binding FoosByRegion}" />

这个方法似乎只能零星地工作,一些Foo对象在UI中更新,但其他的没有-如果通知没有到达UI。

我应该如何处理这个问题?

如何通知完全依赖于ObservableCollection的绑定属性的更改

ContextMenu从Windows Phone工具包应用动画,影响周围元素的不透明度。将不透明度分别应用到子元素上可以解决这个问题。