假设我有一个包含一个窗口的应用程序。窗口内有一个tabcontrol,有三个tabitems。每个tabitem内部都是一个用户控件。
在一个标签中我添加了颜色。在下一个标签中,我添加了Fruit。在第三个选项卡中,我有关系,用户可以在其中添加水果和颜色之间的链接。此关系显示在列表框中,如:
Apple > Red
Pear > Green
在同一个标签下面我缺少水果列表框和缺少颜色列表框...即已添加但未在关系中链接的水果或颜色。我应该解释一下,这些数据都存储在三个单独的文本文件中,fruits.txt,colors.txt和relationss.txt。
我遇到的问题如下。目前,列表框等的填充是在Usercontrol_loaded事件上。对于水果/颜色无关紧要,因为单击添加按钮后,列表会重新加载。问题出在关系屏幕上。
假设用户运行该程序,并单击关系选项卡以查看链接的内容。我们会说上面的例子已经在文本文件中了。所以这种关系显现出来 - 并没有失去成果。然后,用户单击水果选项卡并添加水果,然后添加颜色选项卡并添加颜色。然后移动到关系选项卡。 usercontrol_loaded事件已经发生,因此这两个新添加内容不会显示在列表框中。
如果我将代码移动到GotFocus事件,则用户无法在任何列表框中进行选择,因为它会不断加载,因为点击会触发事件。
除了提供刷新按钮之外,是否有任何其他事件或方式可以在选项卡被“切换到”时刷新?
感谢阅读。
...
编辑1:如果我数据绑定到我在代码隐藏中构建的缺失水果列表,我仍然遇到同样的问题。我每次跳过这个标签时都要重新加载这个列表并返回它(因为它们可能添加了水果或颜色,现在已经丢失了。)
答案 0 :(得分:1)
您需要了解MVVM和更改通知的工作原理。如果您正在跟踪绑定到UI的视图模型类中的可观察集合中跟踪所有这些内容,则无需在 all 处使用事件或代码隐藏。
正如wwosik建议的那样,创建一个类,公开所有可观察集合的公共Colors
,Fruits
和Relationships
属性。正如他/她没有建议但可能应该有的那样,也暴露了公共MissingColors
和MissingFruits
可观察的集合。最后,公开公开SelectedColor
和SelectedFruit
属性。
创建绑定控件:
<ListBox ItemsSource="{Binding Colors}" SelectedItem="{Binding SelectedColor}"/>
<ListBox ItemsSource="{Binding Fruits}" SelectedItem="{Binding SelectedFruit}"/>
<ListBox ItemsSource="{Binding Relationships}"/>
<ListBox ItemsSource="{Binding MissingColors}"/>
<ListBox ItemsSource="{Binding MissingFruits}"/>
实施AddRelationship
方法,添加由SelectedColor
和SelectedFruit
组成的新关系。它还应该从相应的MissingColors
和MissingFruits
集合中删除颜色和水果。创建一个调用此方法的命令,并将其绑定到UI中的某些内容。
就是这样。什么标签都没关系。用户查看内容的顺序无关紧要。当用户添加关系,水果或颜色时,UI将会更新。
答案 1 :(得分:0)
您需要将列表框绑定到ViewModel中的数据。这样,WPF框架就会超过检测更新数据的时刻。
答案 2 :(得分:0)
WPF不是WinForms。您不能自己填充ListBox。
你有
class MyData{
ObservableCollection<Color> Colors;
ObservableCollection<Fruit> Fruits;
ObservableCollection<Pairs> Pairs;
public void MatchCurrentSelection(){
var selectedColor = CollectionViewSource.GetDefaultView(Colors).CurrentItem;
var selectedFruit = CollectionViewSource.GetDefaultView(Fruits).CurrentItem;
if(selectedColor != null && selectedFruit != null){
Colors.Remove(selectedColor);
Fruits.Remove(selectedFruit);
Pairs.Add(new Pair(selectedColor, selectedFruit));
}
}
}
列表框
<ListBox ItemsSource="{Binding Colors}" IsSynchronizedWithCurrentItem="true"/>
<ListBox ItemsSource="{Binding Fruits}" IsSynchronizedWithCurrentItem="true"/>
<ListBox ItemsSource="{Binding Pairs}"/>