簡體   English   中英

如何正確更新 UserControl 組合框的 Itemsource?

[英]How to properly update UserControl combobox's Itemsource?

我對 WPF 完全陌生,並且在ItemsSource更新方面遇到了問題。 我創建了一個帶有選項卡( TabItem (s) 作為UserControl DataContext="{Binding}" )的單個主窗口 Metro 應用程序,其中顯示了不同的數據/使用了不同的方法。

我發現自己在苦苦掙扎的是INotifyPropertyChanged (我無法從類似的示例/問題中理解我的問題的解決方案)接口的概念。 我試圖讓如果在窗口中輸入新數據(從UserControl之一初始化),另一個UserControl (或TabItem )中的ComboBox將自動更新。 這是我所擁有的:

用戶控件1.xaml

 public partial class UserControl1: UserControl
{
    private userlist addlist;
    public UserControl1()
    {
        InitializeComponent();
        fillcombo();
    }
      public void fillcombo()
     {
         Fillfromdb F = new Fillfromdb(); // class that simply connects 
         // to a database sets a datatable as ListCollectionView
         addlist = new addlist { List = F.returnlistview() }; // returns ListCollectionView
         UsersCombo.ItemsSource = addlist.List;
     }

用戶列表.cs

    public class userlist: INotifyPropertyChanged
   {
    private ListCollectionView _list;
    public ListCollectionView List
    {
        get { return this._list; }
        set
        {
            if (this._list!= value)
            {
                this._list= value;
                this.NotifyPropertyChanged("List");
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
   }

Registration.xaml (從另一個UserControl調用)

 public partial class Registration: MetroWindow
{
    public Registration()
    {
        InitializeComponent();
    } 
    private void confirm_button_click(object sender, RoutedEventArgs e)
    {
         // new user is saved to database
         // * here is where I don't know what to do, how to update the ItemSource

    }
   }

這是UserControl.xaml 中ComboBox的設置:

<ComboBox x:Name="UsersCombo" 
 ItemsSource="{Binding List, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>

由於我沒有任何編程教育/經驗,非常通用的建議/解釋將不勝感激。

編輯: Registration.xaml with propertychanged(仍然不起作用):

 public partial class Registration : MetroWindow
{
    public userlist instance = new userlist();
    public ListCollectionView _list1;
    public ListCollectionView List1
    {
        get { return this._list1; }
        set
        {
            if (this._list1 != value)
            {
                this._list1 = value;
                this.NotifyPropertyChanged("List1");
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }


    public Registration()
    {
        InitializeComponent();
        instance.List.PropertyChanged += ComboPropertyChangedHandler();
   }
    private void confirm_button_click(object sender, RoutedEventArgs e)
    {
         // new user is save to database
         // still don't now what to do with new ListCollectionView from database
    }
    public void ComboPropertyChangedHandler(object obj)
    {
        List1 = instance.List; // when new data from database should be loaded?
    }

這是 PropertyChanged 事件派上用場的地方。 將第二個 xaml 頁面中的組合框綁定到一個列表,並創建一個類似於第一個 xaml 中的屬性。

在第二個 xaml.cs 中

public partial class Registration: MetroWindow, INotifyPropertyChanged
{
    private userlist instance = new userlist();
    private ListCollectionView _list1;
    public ListCollectionView List1
    {
        get { return this._list1; }
        set
    {
        if (this._list1 != value)
        {
            this._list1 = value;
            this.NotifyPropertyChanged("List1");
        }
    }
}
public Registration()
{
    InitializeComponent();
    instance.List.PropertyChanged += ComboPropertyChangedHandler();
} 

private void ComboPropertyChangedHandler(object obj)
{
    List1 = instance.List;
    //or iterate through the list and add as below
    foreach(var item in instance.List)
    {
        List1.Add(item);
    }
}
private void confirm_button_click(object sender, RoutedEventArgs e)
    {
         // new user is saved to database
         // * here is where I don't know what to do, how to update the ItemSource
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM