XAML Listbox绑定列表形成另一个.cs

时间:2017-08-03 15:57:35

标签: wpf xaml

学生需要一点帮助:

我在主窗口中有一个List,想要将它绑定到UserControl中的Listbox。

列表的主窗口代码:

    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中,由于test_list未知,因此无法使用Listbox1.ItemsSource = test_list;,这没什么特别的。 我的问题是是否有另外一种方法可以在Listbox1中填写test_list?

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

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

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

提前致谢,祝你有个美好的一天输入代码!

2 个答案:

答案 0 :(得分:0)

将其作为财产。绑定不适用于字段。

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

并且,您应该在T List<T>List<string>List<int>等提供您想要的类型,而不是List<Customer>

更新:以下是其他一些细节: - 你把这个列表放在代码后面的文件中。绑定是使用控件的DataContext属性中的对象完成的,这通常是另一个类(这称为ViewModel),而不是与Window相同的类。 - 如果在 InitializeComponent()被调用后创建了列表,则不会加载它,因为Bindings已经完成且没有列表(尚未)。要检测属性的变化,请实现INotifyPropertyChanged接口(在线有很多示例)。 - 如果您稍后要更改列表中的项目并希望在UI中反映该项目,请使用ObservableCollection<T>而不是List<T>,它会在添加或删除某个元素时通知。

因此,完整的解决方案是: - 创建具有属性test_list的单独类 - 使它实现INotifyPropertyChanged并在属性的setter中从中引发事件 - 如果要添加/删除元素,请使用ObservableCollection代替List。 - 将此类的实例设置为DataContext的{​​{1}}属性。

答案 1 :(得分:0)

UserControl.cs中创建一个属性,该属性将是用户控件中ItemSource的{​​{1}}。 在ListBox

UserControl.cs

在Usercontrol.xaml中:

    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); 
        }
    }

现在,来自父母的构造函数:

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

而不是var names = new List<string>() {"James", "bond"}; myusercontrol.PopulateNames(names); ,您可能希望使用List,因为它内置了更改通知机制。因此,将ObservableCollection设置为Bindingxaml,它将反映在UI中,而无需执行其他代码。另外请记住,在使用ObservableCollection时,如果更改反映在ObservableCollection中,则不应UI更新另一个,而应修改最初创建的更改。

这不是理想的方式,但是当你进一步发展时,你应该研究new模式。这应该可以解决你的要求。