簡體   English   中英

如何創建盡可能多的相同數據綁定組合框,但從同一個字段名中提取不同的值?

[英]How can I create as many of the same databound comboboxes but pull different values from the same fieldname?

我希望這個例子能讓這個問題變得更加清晰。 基本上,我有一類鋼角(我需要知道它們的寬度和厚度)。 我想從.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;
    }

這里的邏輯基本上是設置一個“模板”角度,每個角度都有可能的變化,並根據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

無論如何看看這個鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM