У меня есть 2 поля со списком, в которых содержится список «Элементы» и другой, который содержит список «Подэлементы».Как связать два комбинированных поля вместе в wpf
Список подэлементов зависит от выбранного в данный момент элемента.
У меня есть большая часть этой работы (связывая ItemSource подэлементов с свойством PossibleSubitems), однако проблема заключается в том, что я изменяю Item и Subitem больше не действует для нового элемента. В этом случае я просто хочу выбрать первый действительный подпункт, но вместо этого получаю пустой комбинированный ящик. Обратите внимание, что я считаю, что свойство в классе задано правильно, но привязка, похоже, не отражает его правильно.
Вот какой код, чтобы показать вам, что я делаю. В этом случае, у меня есть: «Пункт 1», который может иметь подпозиция A или подпозиция B и «Пункт 2», который может иметь подпозиция B или подпозиция C
Проблема возникает при переходе к пункту 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. Ключевым моментом здесь является то, что вам нужно моделировать коверцию явно, а не взламывать ее. –
Я не уверен на 100%, что ему нужно, если он сделает это правильно ... Я уверен, что INPC позаботится об этом ... – Noctis
Вы можете сделать это с помощью INPC, но он неэффективен и может взорваться один раз с более сложными моделями, где важны проблемы. В прошлом я привязывался в узлах, не делая этого явно. Я думаю, что лучше быть откровенным с самого начала. YMMV ... –