0

我在一个类上有一个绑定属性,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; }

我的 XAMLItemTemplates在资源中定义了两个如下,

<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 ItemTemplate="{StaticResource MainItemTemplate}" ItemsSource="{Binding FoosByRegion}" />

此方法似乎只是零碎工作,一些Foo对象在 UI 中更新,但其他对象没有 - 好像通知没有到达 UI。

我应该如何解决这个问题?

4

1 回答 1

0

ContextMenu来自 Windows Phone 工具包的动画应用了影响周围元素不透明度的动画。将不透明度应用于子元素单独解决了这个问题。

于 2013-04-01T21:44:16.107 回答