[英]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.