TreeViewItem不使用绑定的ItemsSource,ObservableCollection和INotifyPropertyChanged进行更新

时间:2017-04-14 16:21:27

标签: c# .net wpf xaml

我知道这个问题已经被问了很多,但即使在尝试了所有不同的答案后,我仍然无法让这个为我工作。我正在尝试绑定的对象正在后面的代码中正确更新,因此唯一不起作用的是更改ItemsSource时TreeViewItem的子节点。

似乎我已经正确设置了一切,但也许有一些关于我如何将事情捆绑在一起使得这不起作用。我在Windows 7的VS 2015中使用C#.NET 4.5 WPF项目。我绑定到静态类的静态属性,该属性只有一个到TreeViewItem的ItemsSource的get方法并设置DisplayMemberPath。

XAML:

<!-- Menu tree -->
        <TreeView Grid.Column="0"
                  x:Name="menutree"
                  Background="Transparent"
                  BorderThickness="0">
            <!-- Profiles TVI -->
            <TreeViewItem Header="{x:Static loc:Resources.profiles}"
                          IsExpanded="True">
                <!-- Color profile TVI -->
                <TreeViewItem x:Name="colorTvi"
                              Header="{x:Static loc:Resources.colorProfiles}"
                              MouseRightButtonDown="colorTvi_MouseRightButtonDown"
                              DisplayMemberPath="Name"
                              ItemsSource="{Binding Source={x:Static local:Shared.ColorProfiles}, Mode=OneWay}" />
                 <TreeViewItem ...

被绑定的类/属性:

public static class Shared
{
    #region Getter / Setter

    // Notify property changed
    public static NotifyChanged Notify { get; set; } = new NotifyChanged();

    // All profiles that have been created
    public static List<Profile> Profiles
    {
        get { return _Profiles; }
        set
        {
            // Set profile
            _Profiles = value;
            Notify.OnPropertyChanged(nameof(Profiles));
            Notify.OnPropertyChanged(nameof(ColorProfiles));
        }
    }
    private static List<Profile> _Profiles = new List<Profile>();

    // Color profiles
    public static ObservableCollection<ColorProfile> ColorProfiles
    {
        get
        {
            return new ObservableCollection<ColorProfile>(
                Profiles?.Where(m => m.GetType() == typeof(ColorProfile))?.Cast<ColorProfile>()?.ToList() ??
                new List<ColorProfile>());
        }
    }

    #endregion
}

NotifyChanged类:

// Property changed class
public class NotifyChanged : INotifyPropertyChanged
{

    // Property changed event
    public event PropertyChangedEventHandler PropertyChanged;

    // Notify property changed
    public void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

}

我希望无需在后面的代码中调用Refresh()即可使用。我已经尝试直接绑定到Shared.Profiles,但这没有任何帮助。 ColorProfile是一个继承自Profile的基类。

希望有一些我想念的愚蠢,简单的事情。在此先感谢您的帮助。

更新:

在进一步检查时,实际上看起来ItemsSource甚至没有更新。在调试期间,我可以在控件的属性资源管理器中看到ItemsSource绑定到ObservableCollection,但ItemsSource没有反映对列表所做的更改。如果我在后面的代码中手动绑定,那么它可以工作。

1 个答案:

答案 0 :(得分:0)

Notify是一个大喊大叫PropertyChanged的人。

没有人被绑定到通知,所以没有人正在更新。

需要实现INotifyPropertyChanged或从NotifyChanged继承的人是共享的。