c# - 如何创建尽可能多的相同数据绑定(bind)组合框,但从相同的字段名称中提取不同的值?

标签 c# wpf data-binding combobox datagrid

我希望这个问题通过这个例子变得更清楚。本质上,我有一类角钢(我需要知道它们的宽度和厚度)。我想从 .csv 加载它们,并根据需要创建 k < count 个。

第一个例子:

XAML

            <DataGridTemplateColumn x:Name="cBoxes" Header="Size" Width="*" CanUserReorder="False" CanUserSort="False" CanUserResize="False" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox x:Name="testBox" Margin="2" ItemsSource="{Binding eID}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

        </DataGrid.Columns>
    </DataGrid>

代码隐藏

    public class Angles
    {
        public double TYPE { get; set; }
        public string eID { get; set; }
        public double WIDTH { get; set; }
        public ObservableCollection<double> THICKNESS { get; set; }
    }

    private ObservableCollection<Angles> angleDb = new ObservableCollection<Angles>();
    private ObservableCollection<string> angleIDStrings = new ObservableCollection<string>();

public void LoadAngles()
    {
        var wn = Convert.ToDouble(textboxWebNumber.Text);
        var twn = wn % 2 == .5 ? wn + (wn / 2 - .5) + 6 : wn + (Math.Floor(wn / 2)) + 6;

        var csvColl = (from line in File.ReadAllLines("angledb.csv").Skip(1)
                       let parts = line.Split(',')
                       select new
                       {
                           Width = Convert.ToDouble(parts[0]),
                           Thickness = Convert.ToDouble(parts[1])
                       }).ToList();
        foreach (var item in csvColl)
        {
            var content = $"L{item.Width}x{item.Width}x{item.Thickness}";
            angleIDStrings.Add(content);
            angleDb.Add(new Angles() { 
THICKNESS = item.Thickness, WIDTH = item.Width, eID = angleIDStrings });
        }

        DataContext = angleDb;
    }

这个逻辑本质上是用所有可能的角度 eID 或角度尺寸的所有可能变化加载每个角度。这实际上做了我想要的,除了数据网格填充了与 eID 或 eID.Count 一样多的组合框。

第二个例子应该更清楚我想要什么:

public class Angles
    {
        public double TYPE { get; set; }
        public ObservableCollection<string> eID { get; set; }
        public ObservableCollection<double> WIDTH { get; set; }
        public ObservableCollection<double> THICKNESS { get; set; }

    } // modify the class, changing all fields to observablecollections

 private ObservableCollection<double> angleWidths = new ObservableCollection<double>();
    private ObservableCollection<double> angleThicknesses = new ObservableCollection<double>();

    public List<Angles> finalList = new List<Angles>();
    public void LoadAngles()
    {
        var wn = Convert.ToDouble(textboxWebNumber.Text);
        var twn = wn % 2 == .5 ? wn + (wn / 2 - .5) + 6 : wn + (Math.Floor(wn / 2)) + 6;
        // Read each line, break it at commas, assign split-elements, save into a list.
        var csvColl = (from line in File.ReadAllLines("angledb.csv").Skip(1)
                       let parts = line.Split(',')
                       select new
                       {
                           Width = Convert.ToDouble(parts[0]),
                           Thickness = Convert.ToDouble(parts[1])
                       }).ToList();
        foreach (var item in csvColl)
        {
            var content = $"L{item.Width}x{item.Width}x{item.Thickness}";
            angleIDStrings.Add(content);
            angleThicknesses.Add(item.Thickness);
            angleWidths.Add(item.Width);
        }

        for (var k = 0; k < twn; k++)
        {

            angleDb.Add(new Angles
            {
                THICKNESS = angleThicknesses,
                WIDTH = angleWidths,
                eID = angleIDStrings
            });
        }
        DataContext = angleDb;
    }

这里的逻辑本质上是设置一个"template"角度,每个角度都有所有可能的变化,并根据 k < twn 添加它们

这将生成尽可能多的组合框,但在尝试从中提取 SelectedValue 时会出现问题。

如何找到中间解决方案?

最佳答案

你的问题是糟糕的设计——你应该使用 MVVM 模式。

但简单的解决方案是: XAML

            <DataGridTemplateColumn x:Name="cBoxes" Header="Size" Width="*" CanUserReorder="False" CanUserSort="False" CanUserResize="False" IsReadOnly="True">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
<ComboBox x:Name="testBox" Margin="2" SelectedItem="{Binding SelectedEID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding eID}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

C#

public class Angles
    {
        public double TYPE { get; set; }
        public string SelectedEID { get; set; }


        public ObservableCollection<string> eID { get; set; }
        public ObservableCollection<double> WIDTH { get; set; }
        public ObservableCollection<double> THICKNESS { get; set; }

    } 

显然 Angles class 现在有一个新的 Property 来保存 SelectedItem

无论如何,看看这个 Link

关于c# - 如何创建尽可能多的相同数据绑定(bind)组合框,但从相同的字段名称中提取不同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43039809/

相关文章:

c# - 调用 Application.Shutdown() 后,使用 ShowDialog 显示窗口不起作用

.net - WPF 4 和 .NET 4.5 类层次结构海报

c# - 出现 VerticalScrollBar 时调整边框大小

c# - WPF 应用程序自定义 TTF 字体未使用?

C# 鼠标在 pictureBox 上的位置

c# - 移植到 web api 2 后 NinjectHttpApplication 不起作用

c# - 带有绑定(bind)文本的 WPF 文本 block 不会滚动

WPF OnPropertyChanged 重复代码

data-binding - 绑定(bind)到动态生成的组件/元素的可绑定(bind)属性

c# - Visual Studio 中的基本 Winforms 数据绑定(bind)(设计器模式)