#wpf
#wpf
Вопрос:
Я создаю форму WPF, в которой я хочу получить каскадный выпадающий список внутри ItemsControl. Там будет несколько строк, а источник Dropdown2 зависит от Dropdown1. Строка добавляется, когда я добавляю элемент в filterData, и выпадающий список также заполняется, но я не уверен, как создать реляционную базу данных с несколькими строками
Вот что я пробовал до сих пор
<ItemsControl Grid.Row="1" x:Name="Filter" ItemsSource="{Binding FilterData}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="10" Orientation="Horizontal" >
<CheckBox IsChecked="{Binding Group}"/>
<ComboBox x:Name="cmbCondition" ItemsSource="{Binding ConditionList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
DisplayMemberPath="Name" SelectedValuePath="Name" SelectedItem="{Binding ConditionList}" Width="80" Height="23" />
<ComboBox x:Name="cmbType" ItemsSource="{Binding TypeList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
DisplayMemberPath="Name" SelectedValuePath="Name" SelectedItem="{Binding TypeList}" Width="80" Height="23" />
<ComboBox x:Name="cmbOperator" ItemsSource="{Binding OperatorList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
DisplayMemberPath="Name" SelectedValuePath="Name" SelectedItem="{Binding OperatorList}" Width="80" Height="23" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
public ObservableCollection<FilterData> _FilterData { get; set; }
public ObservableCollection<ConditionList> _ConditionList { get; set; }
public ObservableCollection<TypeList> _TypeList { get; set; }
public IEnumerable<FilterData> FilterData
{
get { return _FilterData; }
}
public IEnumerable<ConditionList> ConditionList
{
get { return _ConditionList; }
}
public IEnumerable<TypeList> TypeList
{
get { return _TypeList; }
}
//Form Load event
Filter.DataContext = this;
AddRow();
private void AddRow()
{
_ConditionList = new ObservableCollection<ConditionList>()
{
new ConditionList() { Name = "AND" },
new ConditionList() { Name = "OR" }
};
_FilterData.Add(new FilterData
{
Group = true,
// Condition = _ConditionList
});
}
// Modal
public class TypeList
{
public string Name { get; set; }
}
public class ConditionList
{
public string Name { get; set; }
}
public class FilterData
{
public bool Group { get; set; }
public ConditionList Condition { get; set; }
}
Комментарии:
1. Почему вы привязали
SelectedItem
andItemsSource
к одному и тому же свойству источника? Это не имеет смысла.2. да, этот код может давать сбои, я новичок в MVVP и WPF. Я не знаю, как получить выбранный элемент ComboBox в серверной части
Ответ №1:
Если вы привяжете SelectedItem
свойство первого ComboBox
к свойству источника типа ConditionList
, вы можете заполнить исходную коллекцию для второго ComboBox
( TypeList
) в установщике этого.
Убедитесь, что вы внедрили интерфейс INotifyPropertyChanged и вызываете PropertyChanged
событие для свойства исходной коллекции, для которого устанавливается новое значение, например:
private ConditionList _selectedCondition;
public ConditionList SelectedCondition
{
get { return _selectedCondition; }
set
{
_selectedCondition = value;
NotifyPropertyChanged();
//populate the list...
TypeList = new List<TypeList> { ... };
}
}
public IEnumerable<TypeList> TypeList
{
get { return _TypeList; }
private set { _TypeList = value; NotifyPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
XAML:
<ComboBox x:Name="cmbCondition" ItemsSource="{Binding ConditionList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}"
DisplayMemberPath="Name"
SelectedItem="{Binding SelectedCondition, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}" Width="80" Height="23" />
<ComboBox x:Name="cmbType" ItemsSource="{Binding TypeList, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}}" ... />
Комментарии:
1. Привет, mm8, извините, я новичок в WPF и не понимаю, куда добавить этот код, когда я добавляю, я получаю следующую ошибку: Не удается неявно преобразовать тип ‘System. Коллекции. Общий. IEnumerable Список типов>’ to’System. Коллекции. Объектная модель. ObservableCollection Список типов>’.
2. В
ObservableCollection
моем примере кода его нет, так откуда вы это берете …?3. Другая проблема, которую я вижу, заключается в том, что я не получаю выбранное значение ComboBox в объекте filterData, оно всегда равно null
4. Пожалуйста, сузьте свой вопрос. Не задавайте несколько вопросов.
5. Конечно, для первого вопроса у меня был _TypeList, определенный как ObservableCollection, вы хотите, чтобы я его удалил?