【问题标题】:XAML Listbox binding List form another .csXAML 列表框绑定列表形成另一个 .cs
【发布时间】:2017-08-03 15:57:35
【问题描述】:

学生需要一点帮助:

我在主窗口中有一个列表,想将它绑定到我的用户控件中的列表框。

我的列表主窗口代码:

    public  List<T> test_list;
    public MainWindow()
    {
        InitializeComponent();
        test_list= new List<T>(); //creating the list
        test_list_fill(); // filling the list with some stuff
    }

在 UserControl .cs 中不能使用 Listbox1.ItemsSource = test_list;,因为 test_list 是未知的,这没什么特别的。 我的问题是有另一种方法可以让 test_list 填写在 Listbox1 中吗?

我尝试了一些 XAML 的东西,但我不会让它工作。

<ListBox x:Name="Listbox1" 
         ItemsSource="{Binding Source=test_list}" 
         Margin="17,130,17,118" >

这至少在列表框中显示“test_list”,但这不是我列表的内容。我知道我以后需要像&lt;TextBlock Text="{Binding name}" 这样的东西来显示内容,但我什至不会得到绑定。有没有在 UserControl.cs 中没有 Listbox1.ItemsSource = test_list; 的解决方案?

在此先感谢,祝您有愉快的一天输入一些代码!

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    在您的UserControl.cs 中创建一个属性,这将是用户控件中ListBoxItemSource。 在UserControl.cs:

        private ObservableCollection<string> _firstNames = new ObservableCollection<string>();
        public ObservableCollection<string> FirstNames { get { return _firstNames; } } 
    
        public void PopulateNames(IEnumerable<string> names)
        {
            foreach (string name in names)
            {
                 _firstNames.Add(name); 
            }
        }
    

    在您的 Usercontrol.xaml 中:

    <ListBox x:Name="listBox" ItemsSource="{Binding FirstNames}"/>
    

    现在,从父级的构造函数:

    var names = new List<string>() {"James", "bond"};
    myusercontrol.PopulateNames(names);
    

    您可能希望使用ObservableCollection 而不是List,因为它内置了更改通知机制。因此,一旦您将xaml 中的Binding 设置为ObservableCollection,它将是无需执行其他代码即可反映在 UI 中。还请记住,在使用 ObservableCollection 时,要使更改反映在 UI 中,您不应将 new 设置为不同的,而应修改最初创建的。

    然而,这不是理想的方式,随着您的进一步发展,您应该研究MVVM 模式。不过,这应该可以解决您的要求。

    【讨论】:

      【解决方案2】:

      使它成为一个属性。绑定不适用于字段。

      public List<T> test_list {get;set;}
      

      此外,您应该提供您想要成为的类型,而不是 List&lt;T&gt; 中的 T,例如 List&lt;string&gt;List&lt;int&gt;List&lt;Customer&gt; 等。

      更新:以下是其他一些详细信息: - 你把这个列表放在文件后面的代码中。绑定是使用控件的DataContext 属性中的对象完成的,这通常是另一个类(这称为 ViewModel),而不是与Window 相同的类。 - 如果您在调用InitializeComponent() 之后 创建了列表,那么它将不会被加载,因为绑定已经完成并且没有列表(还)。检测属性变化,实现INotifyPropertyChanged接口(网上有很多例子)。 - 如果您稍后将更改列表中的项目并希望在 UI 中反映出来,请使用 ObservableCollection&lt;T&gt; 而不是 List&lt;T&gt;,它会在添加或删除某些元素时通知。

      因此,完整的解决方案是: -创建具有属性test_list的单独类 - 使其实现INotifyPropertyChanged 并在属性的设置器中从中引发事件 - 如果要添加/删除元素,请使用ObservableCollection 而不是List。 - 将此类的实例设置为WindowDataContext 属性。

      【讨论】:

      • 完成。现在列表框上有一个滚动条,但仍然没有价值。我需要用ItemsSource="{Binding Source=test_list}" 改变一些东西吗?这样,我可以点击一个大的白色光束,ItemsSource="{Binding test_list}" 什么都没有。
      • 我用一些额外的细节更新了答案。它是更完整和详细的解决方案。如果您遇到困难,请告诉我 :) 另外,请查看在线 MVVM 模式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多