我有兩個組合框,一個包含'Items'列表,另一個包含'Subitems'列表。如何將兩個組合框綁在一起wpf
子項目列表取決於當前選擇的項目。
我已經得到了大部分工作(通過將子項的ItemSource綁定到PossibleSubitems屬性),但是問題是當我更改Item並且Subitem不再對新項目有效時。在這種情況下,我只想選擇第一個有效的子項目,但是我得到一個空白的組合框。請注意,我認爲該類中的屬性設置正確,但綁定似乎沒有正確反映它。
下面是一些代碼,告訴你我在做什麼。在這種情況下,我有: 「項目1」可以具有子項A或子項B和 「項目2」可以具有子項B或子項Ç
當我切換到第2項時,我有這個問題是選擇子項A.
XAML
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="134" Width="136">
<StackPanel Height="Auto" Width="Auto">
<ComboBox ItemsSource="{Binding PossibleItems, Mode=OneWay}" Text="{Binding CurrentItem}"/>
<ComboBox ItemsSource="{Binding PossibleSubitems, Mode=OneWay}" Text="{Binding CurrentSubitem}"/>
</StackPanel>
</Window>
代碼背後:
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
namespace WpfApplication1
{
public partial class MainWindow : Window, INotifyPropertyChanged
{
// List of potential Items, used to populate the options for the Items combo box
public ObservableCollection<string> PossibleItems
{
get
{
ObservableCollection<string> retVal = new ObservableCollection<string>();
retVal.Add("Item 1");
retVal.Add("Item 2");
return retVal;
}
}
// List of potential Items, used to populate the options for the Subitems combo box
public ObservableCollection<string> PossibleSubitems
{
get
{
ObservableCollection<string> retVal = new ObservableCollection<string>();
if (CurrentItem == PossibleItems[0])
{
retVal.Add("Subitem A");
retVal.Add("Subitem B");
}
else
{
retVal.Add("Subitem B");
retVal.Add("Subitem C");
}
return retVal;
}
}
// Track the selected Item
private string _currentItem;
public string CurrentItem
{
get { return _currentItem; }
set
{
_currentItem = value;
// Changing the item changes the possible sub items
NotifyPropertyChanged("PossibleSubitems");
}
}
// Track the selected Subitem
private string _currentSubitem;
public string CurrentSubitem
{
get { return _currentSubitem; }
set
{
if (PossibleSubitems.Contains(value))
{
_currentSubitem = value;
}
else
{
_currentSubitem = PossibleSubitems[0];
// We're not using the valuie specified, so notify that we have in fact changed
NotifyPropertyChanged("CurrentSubitem");
}
}
}
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
CurrentItem = PossibleItems[0];
CurrentSubitem = PossibleSubitems[0];
}
public event PropertyChangedEventHandler PropertyChanged;
internal void NotifyPropertyChanged(String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
同意其他海報對採用MVVM方法的評論。這裏的關鍵在於你需要明確地模擬Coersion而不是繞開它。 –
我不是100%肯定他需要,如果他以正確的方式做...我確信INPC會照顧那個...... – Noctis
你可以使用INPC做到這一點,但效率不高,並且可能會在更復雜的模型中爆炸一次,而這些模型在事前很重要。過去我並沒有明確地把自己束縛住。我認爲最好從一開始就明確。 YMMV ... –