Создайте несколько комбинированных списков в WPF на основе списка DataTable - PullRequest
0 голосов
/ 23 января 2020

Я хочу создать динамические c комбинированные списки на основе списка таблиц данных. Каждый раз, когда я добавляю новый список данных в список, я хочу, чтобы пользовательский интерфейс генерировал новый комбинированный список, в котором отображается столбец, указанный в таблице. Я попробовал это с помощью itemscontrol и datatemplate, но не работает так, как мне хочется.

public List<DataTable> DtList
    {
        get { return dtList; }
        set { dtList = value; }
    }


<ItemsControl ItemsSource="{Binding Path=DtList}" >
        <ItemsControl.ItemsPanel>
          <ItemsPanelTemplate>
            <WrapPanel Orientation="Horizontal"/>
          </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate >
          <DataTemplate>
            <ComboBox 
                          VerticalContentAlignment="Center"
                          HorizontalContentAlignment="Left"
                          Margin="0,0,4,10"
                          Width="200"
                          BorderBrush="{DynamicResource ListBox.Static.Border}"
                          ItemsSource="{Binding DataSet}"
                          DisplayMemberPath="Element Name"
                          SelectedValuePath="ResourceType Name"
                          SelectedValue="{Binding SelectedRelationPath, Mode=TwoWay}" 
                          />
          </DataTemplate>
        </ItemsControl.ItemTemplate>
      </ItemsControl>

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Я только что создал образец, и он работает для меня

 public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
          //  this.DataContext = this; Uncomment this if code behind is your datacontext
            InitializeComponent();
            DataTable t1 = new DataTable();
            t1.Columns.Add("Name");
            t1.Columns.Add("Age");
            t1.Rows.Add("A", "1");
            t1.Rows.Add("B", "2");
            DataTable t2 = new DataTable();
            t2.Columns.Add("Name");
            t2.Columns.Add("Age");
            t2.Rows.Add("A", "1");
            DtList = new List<DataTable> { t1, t2 };
        }
        private List<DataTable> dtList;
        public List<DataTable> DtList
        {
            get { return dtList; }
            set
            {
                dtList = value;
                OnPropertyChanged("DtList");
            }
        }
        private string selectedName;
        public string SelectedName
        {
           get { return selectedName; }
           set
           {
              selectedName = value;
              OnPropertyChanged("SelectedName");
           }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler == null) return;
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

В вашем Xaml добавьте это в вашем окне или теге UserControl

x:Name="windowName"

Теперь сделайте это

<StackPanel>
        <ItemsControl ItemsSource="{Binding Path=DtList}" >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate >
                <DataTemplate>
                    <ComboBox 
                          VerticalContentAlignment="Center"
                          HorizontalContentAlignment="Left"
                          Margin="0,0,4,10"
                          Width="200"
                          ItemsSource="{Binding}"
                          DisplayMemberPath="Name"
                          SelectedValuePath="Age" 
                          SelectedValue="{Binding Path=SelectedName,ElementName=windowName}"
                          />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>

Это прекрасно работает для меня.

0 голосов
/ 23 января 2020

Полагаю, у вас неправильная привязка к элементам комбинированного списка. Есть ли какие-либо ошибки привязки wpf в окне вывода VS при открытии формы в режиме отладки?

вы связали ItemsControl со свойством DtList. Это хорошо, и для каждого элемента в списке должен быть создан комбинированный список. У вас есть списки, созданные для каждой записи в DtList во время выполнения?

Однако привязка элемента списка не выглядит корректно для меня. Каждый комбинированный список получает элемент DtList в качестве контекста данных. Но вы связали это как ItemsSource="{Binding DataSet}". Это делает выпадающий список для чтения элементов из свойства DataTable.DataSet.

Пожалуйста, попробуйте изменить привязку выпадающего списка, например ItemsSource="{Binding Rows}"

...