在tabitems中加载列表框 - 要使用哪个事件?

时间:2010-02-23 23:19:20

标签: c# wpf events listbox tabcontrol

假设我有一个包含一个窗口的应用程序。窗口内有一个tabcontrol,有三个tabitems。每个tabitem内部都是一个用户控件。

在一个标签中我添加了颜色。在下一个标签中,我添加了Fruit。在第三个选项卡中,我有关系,用户可以在其中添加水果和颜色之间的链接。此关系显示在列表框中,如:

Apple > Red
Pear  > Green

在同一个标​​签下面我缺少水果列表框和缺少颜色列表框...即已添加但未在关系中链接的水果或颜色。我应该解释一下,这些数据都存储在三个单独的文本文件中,fruits.txt,colors.txt和relationss.txt。

我遇到的问题如下。目前,列表框等的填充是在Usercontrol_loaded事件上。对于水果/颜色无关紧要,因为单击添加按钮后,列表会重新加载。问题出在关系屏幕上。

假设用户运行该程序,并单击关系选项卡以查看链接的内容。我们会说上面的例子已经在文本文件中了。所以这种关系显现出来 - 并没有失去成果。然后,用户单击水果选项卡并添加水果,然后添加颜色选项卡并添加颜色。然后移动到关系选项卡。 usercontrol_loaded事件已经发生,因此这两个新添加内容不会显示在列表框中。

如果我将代码移动到GotFocus事件,则用户无法在任何列表框中进行选择,因为它会不断加载,因为点击会触发事件。

除了提供刷新按钮之外,是否有任何其他事件或方式可以在选项卡被“切换到”时刷新?

感谢阅读。

...

编辑1:如果我数据绑定到我在代码隐藏中构建的缺失水果列表,我仍然遇到同样的问题。我每次跳过这个标签时都要重新加载这个列表并返回它(因为它们可能添加了水果或颜色,现在已经丢失了。)

3 个答案:

答案 0 :(得分:1)

您需要了解MVVM和更改通知的工作原理。如果您正在跟踪绑定到UI的视图模型类中的可观察集合中跟踪所有这些内容,则无需在 all 处使用事件或代码隐藏。

正如wwosik建议的那样,创建一个类,公开所有可观察集合的公共ColorsFruitsRelationships属性。正如他/她没有建议但可能应该有的那样,也暴露了公共MissingColorsMissingFruits可观察的集合。最后,公开公开SelectedColorSelectedFruit属性。

创建绑定控件:

<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方法,添加由SelectedColorSelectedFruit组成的新关系。它还应该从相应的MissingColorsMissingFruits集合中删除颜色和水果。创建一个调用此方法的命令,并将其绑定到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}"/>