我知道这个问题已经被问了很多,但即使在尝试了所有不同的答案后,我仍然无法让这个为我工作。我正在尝试绑定的对象正在后面的代码中正确更新,因此唯一不起作用的是更改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没有反映对列表所做的更改。如果我在后面的代码中手动绑定,那么它可以工作。
答案 0 :(得分:0)
Notify是一个大喊大叫PropertyChanged的人。
没有人被绑定到通知,所以没有人正在更新。
需要实现INotifyPropertyChanged或从NotifyChanged继承的人是共享的。