【问题标题】:WPF XAML database driven checkbox valuesWPF XAML 数据库驱动的复选框值
【发布时间】:2016-04-26 22:30:09
【问题描述】:

如何在 XAML 中显示未知数量的复选框?我正在查询数据库以提取可能值的列表,然后我想将这些值显示为复选框列表。一些数据库表可能有少量值,其他可能有 100+。

XAML:

<ListBox x:Name="SuppliersSearchStatusListBox" Margin="100,100,0,0" ScrollViewer.CanContentScroll="True" AllowDrop="True" MaxHeight="50" MaxWidth="200" HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding ListStatusOptions}">
  <CheckBox Content="{Binding arrStatusOption}"/>
</ListBox>

CS:

public void ListStatusOptions()
{
    // Query, vars and debug info removed
    conn.Open();
    SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQLQuery, conn);
    DataSet ds = new DataSet();
    dataAdapter.Fill(ds, "StatusOptions");

    int varArrCount = ds.Tables[0].Rows.Count;

    string[] arrStatusOption = new string[varArrCount];
    int i = 0;
    foreach (DataRow dr in ds.Tables[0].Rows)
    {
        arrStatusOption[i] = dr["StatusValue"].ToString();
        i++;
    }
    conn.Close();
}

DB 查询将结果返回到数组中,并且值与预期的一样,但复选框列表不会出现在 XAML 页面上。我错过了什么?

【问题讨论】:

    标签: c# wpf database xaml checkbox


    【解决方案1】:

    使用数据模板对 ListBox 中的每个项目进行模板化:

    <ListBox x:Name="SuppliersSearchStatusListBox"
             scrollViewer.CanContentScroll="True"
             AllowDrop="True"
             ItemsSource="{Binding ListStatusOptions}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding arrStatusOption}"
                          IsChecked="{Binding IsChecked}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    然后将 ListStatusOptions 更改为具有要绑定的 IsSelected 属性的新类,而不仅仅是字符串

    public class StatusOption
    {
        public string name { get; set; }
        public bool IsSelected { get; set; }
    }
    

    然后更改您的代码以使用这个新类

    public void ListStatusOptions()
    {
        // Query, vars and debug info removed
        conn.Open();
        SqlDataAdapter dataAdapter = new SqlDataAdapter(strSQLQuery, conn);
        DataSet ds = new DataSet();
        dataAdapter.Fill(ds, "StatusOptions");
    
        int varArrCount = ds.Tables[0].Rows.Count;
    
        var arrStatusOption = new StatusOption[varArrCount];
        int i = 0;
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            arrStatusOption[i] = new StatusOption
                                     {
                                         Name = dr["StatusValue"].ToString(),
                                         IsSelected = false
                                     }
            i++;
        }
        conn.Close();
    }
    

    【讨论】:

    • 谢谢。我无法自称理解这些变化,但这就是学习的乐趣,让 Wrox 新闻继续前进 :-)
    猜你喜欢
    • 2016-07-21
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多