【问题标题】:Generate several Comboboxes in WPF Based on DataTable ListWPF中基于DataTable List生成几个Comboboxes
【发布时间】:2020-05-09 11:09:02
【问题描述】:

我想根据数据表列表创建动态组合框。 每次我向列表中添加一个新的数据表时,我都希望 UI 生成一个新的组合框,该组合框显示我从表中指定的列。我使用 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>

【问题讨论】:

    标签: c# wpf xaml data-binding datatemplate


    【解决方案1】:

    我刚刚创建了一个示例,它对我有用

     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>
    

    这对我来说很好。

    【讨论】:

    • 谢谢现在它对我有用你知道为什么选择值在我的类中找不到属性它现在只显示数据表类的属性
    • 在这种情况下,您有多个组合框。您需要将每个组合框的选定值绑定到每个属性还是将所有组合框选定值绑定到单个属性?
    • 到一个
    • 我已经编辑了代码看看。如果你做对了就点赞。
    • 仍然无法访问我的财产
    【解决方案2】:

    我想您对组合框项目的绑定有误。调试下打开表单时VS输出窗口有wpf绑定错误吗?

    您已将ItemsControl 绑定到DtList 属性。这很好,应该为列表组合框中的每个项目创建。您是否在运行时为 DtList 中的每条记录创建了组合框?

    但是,组合框项绑定对我来说看起来不正确。每个组合框都将DtList 项目作为数据上下文。但是你已经像ItemsSource="{Binding DataSet}" 一样绑定了它。这使得组合框可以从 DataTable.DataSet 属性中读取项目。

    请尝试更改组合框项绑定,例如ItemsSource="{Binding Rows}"

    【讨论】:

    • 像你说的那样编辑它仍然不起作用没有生成组合框
    • 请检查您在DtList 列表中是否有某些项目。添加新控件(如列表框)并绑定其项目源以检查您的列表是否填充了项目ItemsSource="{Binding Path=DtList}"。如果在显示表单后加载表格(例如单击按钮时),您应该在视图模型类中使用ObservableCollection&lt;DataTable&gt; DtList
    猜你喜欢
    • 2021-07-22
    • 2016-07-22
    • 2018-12-11
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多