【问题标题】:Silverlight dynamic column with checkboxes带有复选框的 Silverlight 动态列
【发布时间】:2013-09-11 13:34:29
【问题描述】:

我是 mvvm 的新手,并尝试学习。所以我创建了新项目并学习了,但是:我对 Silverlight 的复选框有疑问(花了两天时间)我不知道如何在 silverlight mvvm 中绑定复选框。

在我的 xaml 文件中,我有

        <sdk:DataGrid x:Name="List_ServicessProcess" AutoGenerateColumns="False">
        <sdk:DataGrid.Columns>
            <sdk:DataGridTemplateColumn>
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Summary[0].Total}" />
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn>
                <sdk:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Summary[0].Total}" />
                    </DataTemplate>
                </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>
        </sdk:DataGrid.Columns>
    </sdk:DataGrid>

在我的 C# 代码中:

public class SaleData
{
    public int Categoryid { get; set; }
    public string Category { get; set; }
    public List<YearSummary> Summary { get; set; }
}

public class YearSummary
{
    public int Year { get; set; }
    public double Total { get; set; }
    public List<OnWarehouse> Warehouse { get; set; }
}

public class OnWarehouse
{
    public bool yes { get; set; }
}

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        var data = GetData();
        List_ServicessProcess.ItemsSource = data;
        var firstRow = data.First();

        for (int i = 0; i < firstRow.Summary.Count; i++)
        {
            var monthlySummary = firstRow.Summary[i];
            List_ServicessProcess.Columns.Add(CreateColumn(i, monthlySummary.Year.ToString()));
        }
    }

    public static List<SaleData> GetData()
    {
        List<SaleData> data = new List<SaleData>();
        data.Add(new SaleData() { Category = "Laptop Toshiba xyz", Summary = GetSummaryData() });
        data.Add(new SaleData() { Category = "Laptop Toshiba xyz", Summary = GetSummaryData() });
        data.Add(new SaleData() { Category = "Laptop Toshiba yzx", Summary = GetSummaryData() });
        data.Add(new SaleData() { Category = "Laptop Toshiba yzx", Summary = GetSummaryData() });
        data.Add(new SaleData() { Category = "Laptop Toshiba yzx", Summary = GetSummaryData() });
        return data;
    }

    private static List<YearSummary> GetSummaryData()
    {
        List<YearSummary> data = new List<YearSummary>();
        Random rnd = new Random();

        for (int i = 0; i < 5; i++)
        {
            var summary = new YearSummary() { Total = rnd.Next(-5000, 10000), Year = 2008 + i, Warehouse = GetWarehouse() };
            data.Add(summary);
        }

        return data;
    }

    private static List<OnWarehouse> GetWarehouse()
    {
        List<OnWarehouse> data = new List<OnWarehouse>();

        Random rnd = new Random();

        for (int i = 0; i < 4; i++)
        {
            var summary = new OnWarehouse() { yes = (i % 2 == 0)};

            data.Add(summary);
        }
        return data;
    }

    private DataGridTemplateColumn CreateColumn(int index, string header)
    {
        string cellTemp = string.Format(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
            xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
             <CheckBox IsChecked=""{{Binding Path=Warehouse[{0}].yes,Mode=TwoWay}}""/>
        </DataTemplate>", index);

        DataGridTemplateColumn column = new DataGridTemplateColumn();
        column.Header = header;
        column.CellTemplate = (DataTemplate)XamlReader.Load(cellTemp);
        return column;
    }
}

当我开始我的简单项目时,复选框未被选中。

最终结果:

finally result

有什么帮助吗?谢谢。 雅各布斯

【问题讨论】:

  • xaml 中的复选框在哪里?
  • 我在 CreateColumn 方法中添加动态列,并且在
  • 帮我太难了?也许再见我重复我的问题:当我创建动态列时,如何有时不检查添加复选框?

标签: c# wpf silverlight mvvm datagrid


【解决方案1】:

按照您的要求,如果我理解正确,您将显示给定的Category 是否在特定年份的仓库中。我不知道你为什么在YearSummary 中有OnWarehouse 的列表,但考虑到DataGrid 中的每一行都代表SaleData,并且你每年根据YearSummary 的列表添加列你的SalesData 那么xaml 不应该是这样的

string.Format(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
            xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
             <CheckBox IsChecked=""{{Binding Path=Summary[{0}].Warehouse[0].yes,Mode=TwoWay}}""/>
        </DataTemplate>", index);

【讨论】:

  • nit,感谢您的重复。你的建议解决了我的问题 :) 愚蠢的逻辑错误 :)。
猜你喜欢
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
相关资源
最近更新 更多