[英]Loading listboxes inside tabitems - which event to use?
可以说我有一个包含一个窗口的应用程序。 窗口内部是一个tabcontrol,具有三个tabitems。 每个选项中都有一个用户控件。
在一个标签中,我有添加颜色。 在下一个标签中,我添加了Fruit。 在第三个选项卡中,我具有关系,用户可以在其中添加水果和颜色之间的链接。 此关系显示在如下列表框中:
Apple > Red
Pear > Green
在同一标签下的该位置下,我缺少水果列表框和颜色列表框...即水果或已添加但未在关系中链接的颜色。 我应该解释一下,这些数据都存储在三个单独的文本文件中,fruits.txt,colors.txt和Relationships.txt。
我的问题如下。 目前,列表框等的填充处于Usercontrol_loaded事件上。 水果/颜色无关紧要,因为单击添加按钮后,列表会重新加载。 问题出在关系屏幕上。
假设用户运行该程序,然后单击“关系”选项卡以查看链接的内容。 我们将说上面的示例已经在文本文件中。 这样,这种关系就显现出来了,而且也不会丢失任何成果。 然后,用户单击“水果”选项卡并添加水果,然后单击“颜色”选项卡并添加颜色。 然后移至“关系”选项卡。 usercontrol_loaded事件已经发生,因此这两个新添加项不会显示在列表框中。
如果我将代码移到GotFocus事件,则用户无法在任何列表框中进行选择,因为它会不断加载,因为单击会触发该事件。
除了提供“刷新”按钮以外,是否有其他事件或方式可以使此选项卡“切换到”?
谢谢阅读。
...
编辑1:如果我将数据绑定到我在后面的代码中构建的缺少水果的列表,则我仍然有同样的问题。 每当他们离开此标签并返回到该标签时,我都必须重新加载此列表(因为他们可能添加了一种水果或一种颜色,现在已经缺少了)。
您需要了解MVVM和更改通知的工作方式。 你并不需要,如果你跟踪所有的这些东西在视图模型类观察集合绑定到用户界面使用事件或代码隐藏在所有 。
如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将会更新。
您需要将列表框绑定到ViewModel中的数据。 这样,WPF框架就超过了何时更新数据的检测。
WPF不是WinForms。 您不会自己填充ListBoxes。
你有
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}"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.