我创建了ObservableCollection,它可以用于绑定等。现在,当我向集合中添加项目时,我遇到了一个问题,它不可见
尝试了大多数东西,但可能遗漏了一些明显的东西。
主类:
public class MainClass
{
public MainClass()
{
InitializeComponent();
DataContext = this;
}
static MainClass instance = null;
static readonly object padlock = new object();
public static MainClass Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new MainClass();
}
return instance;
}
}
}
private ObservableCollection<Server> _myListOfServersObjects;
public ObservableCollection<Server> ObservableServers
{
get
{
if (_myListOfServersObjects == null)
ObservableServers = new ObservableCollection<Server>();
return _myListOfServersObjects;
}
set
{
if (_myListOfServersObjects != value)
{
_myListOfServersObjects = value;
OnPropertyChanged("ObservableServers");
}
}
}
}
我正在尝试添加一个项目:
public class AnotherClass
{
public void AddItem(object sender, RoutedEventArgs e)
{
MainClass.Instance.ObservableServers.Add(new Server("127.0.0.1:8890", "127.0.0.1:8890", false, "Test add", "23 / 1000", 82, "Test mode", "Test map"));
}
}
WPF主分类:https://pastebin.com/YzvdmhvW
WPF AnotherClass:https://pastebin.com/1pvT3Z35
结构:https://pastebin.com/hqcwxcJz
与问题有关!!!
答案 0 :(得分:0)
您定义可观察集合的方式存在一些问题:
首先,UIElement
(例如您的MainClass)是DependencyObject
,并且没有实现INotifyPropertyChanged
。因此,除非将OnPropertyChanged("ObservableServers")
定义为ObservableServers
DependencyProperty
不会有任何作用。
第二,我看不到您尝试重新创建ObservableServers
的任何地方,因此在get
内实例化它是毫无意义的。
到此为止的所有人:
要使绑定生效,您不必总是通知有关更改。如果您不这样做,则XAML只会将默认值作为其绑定源。因此,默认情况下应初始化_myListOfServersObjects
后场:
private ObservableCollection<Server> _myListOfServersObjects = new ObservableCollection<Server>();
该属性应类似于:
public ObservableCollection<Server> ObservableServers
{
get
{
return _myListOfServersObjects;
}
}
但是,如果您有理由监视对可观察集合自身(而非项目)所做的更改,则可以将其定义为DependencyProperty
,例如:
public Server ObservableServers
{
get { return (Server)GetValue(ObservableServersProperty); }
set { SetValue(ObservableServersProperty, value); }
}
public static readonly DependencyProperty ObservableServersProperty =
DependencyProperty.Register("ObservableServers", typeof(Server), typeof(MainClass), new PropertyMetadata(null));
当绑定到父视图内部的属性时(例如,绑定目标位于UserControl内部,而UserControl位于MainClass内部,并且MainClass具有用作绑定源的属性),可以使用{{1} }找到绑定源:
所以不是
RelativeSource
写
ItemsSource="{Binding ElementName=MainClassTab, Path=ObservableServers}"