【问题标题】:Custom control and element binding自定义控件和元素绑定
【发布时间】:2014-07-22 08:39:56
【问题描述】:

我正在创建自定义控件,该控件将包含动态添加(或删除)行和列的网格。每个单元格必须包含将与某些模型绑定的复选框。如果用户点击复选框,字典应该刷新。

Model.cs

public class Model
{
    public Model(List<PanelModel> panels)
    {
        this.Panels = new Dictionary<int, bool>();   
        panels.ForEach(panel => this.Panels.Add(panel.Id, false));
    }

    ...

    public Dictionary<int, bool> Panels { get; set; } 
}

CustomControl.cs

CheckBox checkBox = new CheckBox
{
    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center
};
Grid.SetRow(checkBox, index);
Grid.SetColumn(checkBox, innerIndex);

Binding binding = new Binding(string.Format("Panels[{0}]", panel.Id));
binding.Source = this.Configurations;
binding.Mode = BindingMode.TwoWay;
checkBox.SetBinding(CheckBox.IsCheckedProperty, binding);

this.mainGrid.Children.Add(checkBox);

如何将特定复选框与字典Panels 中的元素绑定?字典包含 int - bool 对,这意味着 ID 为 x 的面板处于打开或关闭状态。

现在,如果我点击复选框,什么都不会发生。调试器显示,所有面板都是假的(关闭)。

【问题讨论】:

  • 你确定this.Configurations 真的是Model 类型吗?从您的问题来看,这一点并不明显。

标签: c# wpf binding


【解决方案1】:

根据您的描述,我将使用 ItemsControl 来解决此问题,其中 ItemsSource 绑定到您的集合。

然后添加一个 ItemTemplate,它通过绑定到复选框来呈现布尔值。

您可以将 ItemsControl PanelTemplate 设置为 WrapPanel 以获得网格布局外观。

【讨论】:

  • 问题是,我动态渲染所有列和行,依赖于另外两个集合。
  • 您的列和行集合包含什么?
  • 行是面板的集合,列是配置。它们是混合的。我认为解释起来太复杂了,我用事件驱动的方法解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多