没有元素从另一个类添加到ObservableCollection

时间:2018-08-04 18:13:43

标签: c# wpf data-binding

我创建了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

与问题有关!!!

1 个答案:

答案 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}"