学生需要一点帮助:
我在主窗口中有一个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;
的解决方案吗?
提前致谢,祝你有个美好的一天输入代码!
答案 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
设置为Binding
后xaml
,它将反映在UI中,而无需执行其他代码。另外请记住,在使用ObservableCollection
时,如果更改反映在ObservableCollection
中,则不应UI
更新另一个,而应修改最初创建的更改。
这不是理想的方式,但是当你进一步发展时,你应该研究new
模式。这应该可以解决你的要求。