Как создать каскадный выпадающий список внутри DataTemplate?

#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 and ItemsSource к одному и тому же свойству источника? Это не имеет смысла.

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, вы хотите, чтобы я его удалил?