找回密码
 立即注册

QQ登录

只需一步,快速开始

heyixiaoran

论坛元老

6

主题

26

帖子

9032

积分

论坛元老

积分
9032

活字格认证微信认证勋章元老葡萄

heyixiaoran
论坛元老   /  发表于:2014-11-27 19:21  /   查看:6991  /  回复:5
Xaml 里写死是
  1. <c1:C1DataGrid >
  2.                         <c1:C1DataGrid.Columns>
  3.                             <c1:DataGridTextColumn Width="70"
  4.                                                    Binding="{Binding ClientId}"
  5.                                                    Header="ID" />
  6.                             <c1:DataGridTextColumn Width="200"
  7.                                                    Binding="{Binding ClientName}"
  8.                                                    Header="客户" />
  9.                             <c1:DataGridTextColumn Width="155"
  10.                                                    Binding="{Binding ClientCreateDate}"
  11.                                                    Header="创建时间" />
  12.                         </c1:C1DataGrid.Columns>
  13.                     </c1:C1DataGrid>
复制代码
            

C1DataGrid  的 Columns 不是依赖属性,那怎么动态绑定列结构呢?也就是说要显示的表是不固定的

5 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2014-11-28 11:26:00
沙发
回复 1楼heyixiaoran的帖子

我写个基本的思路给你吧。
1.比如说数据源是这样的,里面有FirstName和LastName两列:
  1. public class Property : INotifyPropertyChanged
  2.     {
  3.         public Property(string name, object value)
  4.         {
  5.             Name = name;
  6.             Value = value;
  7.         }

  8.         public string Name { get; private set; }
  9.         public object Value { get; set; }

  10.         public event PropertyChangedEventHandler PropertyChanged;
  11.     }
  12.     public class Record
  13.     {
  14.         private readonly ObservableCollection<Property> properties = new ObservableCollection<Property>();

  15.         public Record(params Property[] properties)
  16.         {
  17.             foreach (var property in properties)
  18.                 Properties.Add(property);
  19.         }

  20.         public ObservableCollection<Property> Properties
  21.         {
  22.             get { return properties; }
  23.         }
  24.     }
复制代码

2.XMAL的代码绑定数据源应该这样写:
  1. <c1:C1DataGrid  AutoGenerateColumns="false"
  2.    ItemsSource="{Binding Path=Records}" />
复制代码

3.初始化数据,然后动态绑定列:
  1. var records = new ObservableCollection<Record>();
  2.             records.Add(new Record(new Property("FirstName", "Paul"), new Property("LastName", "Stovell")));
  3.             records.Add(new Record(new Property("FirstName", "Tony"), new Property("LastName", "Black")));

  4.             var columns = records.First()
  5.     .Properties
  6.     .Select((x, i) => new { Name = x.Name, Index = i })
  7.     .ToArray();

  8.             foreach (var column in columns)
  9.             {
  10.                 var binding = new Binding(string.Format("Properties[{0}].Value", column.Index));
  11.                 C1.WPF.DataGrid.DataGridTextColumn textColumn = new C1.WPF.DataGrid.DataGridTextColumn();
  12.                 textColumn.Header = column.Name;
  13.                 textColumn.Binding = binding;
  14.                 this.c1DataGrid1.Columns.Add(textColumn);
  15.             }
复制代码


其他的比如模板设计,你可以写代码实现。

评分

参与人数 1满意度 +5 收起 理由
heyixiaoran + 5 非常感谢帮忙

查看全部评分

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
heyixiaoran
论坛元老   /  发表于:2014-11-28 18:14:00
板凳
感谢及时回复,看到前搞定了,朋友告诉我用了附加属性弄的,这样VM里不会出现任何和控件相关的属性,PCL的VM和View 不在一个项目里,夹杂了一些业务上的东西,不是太全,但是大概意思到了

  1. public class ColumnConfig
  2.     {
  3.         public string HeaderName { get; set; }
  4.         public string ColumnName { get; set; }
  5.         public string FormatString { get; set; }
  6.     }
复制代码

  1. public static class C1FlexGridExtensions
  2.     {
  3.         public static ObservableCollection<ColumnConfig> GetBindingColumns(DependencyObject obj)
  4.         {
  5.             return (ObservableCollection<ColumnConfig>)obj.GetValue(BindingColumnsProperty);
  6.         }

  7.         public static void SetBindingColumns(DependencyObject obj, ObservableCollection<ColumnConfig> value)
  8.         {
  9.             obj.SetValue(BindingColumnsProperty, value);
  10.         }

  11.         // Using a DependencyProperty as the backing store for BindingColumns.  This enables animation, styling, binding, etc...
  12.         public static readonly DependencyProperty BindingColumnsProperty =
  13.             DependencyProperty.RegisterAttached("BindingColumns", typeof(ObservableCollection<ColumnConfig>), typeof(C1FlexGridExtensions), new PropertyMetadata(null, BindingColumnsChanged));

  14.         private static void BindingColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  15.         {
  16.             var bindingColumns = e.NewValue as ObservableCollection<ColumnConfig>;
  17.             if (bindingColumns != null)
  18.             {
  19.                 var c1FlexGrid = d as C1FlexGrid;
  20.                 if (c1FlexGrid != null)
  21.                 {
  22.                     foreach (var bindingColumn in bindingColumns)
  23.                     {

  24.                         c1FlexGrid.Columns.Add(new Column
  25.                         {
  26.                             Header = bindingColumn.HeaderName,
  27.                             Binding = new Binding(bindingColumn.ColumnName),
  28.                             Width = new GridLength(bindingColumn.Width),
  29.                             Format = bindingColumn.FormatString
  30.                         });
  31.                     }
  32.                 }
  33.             }
  34.         }



  35.         public static int GetBindingFrozenColumns(DependencyObject obj)
  36.         {
  37.             return (int)obj.GetValue(BindingFrozenColumnsProperty);
  38.         }

  39.         public static void SetBindingFrozenColumns(DependencyObject obj, int value)
  40.         {
  41.             obj.SetValue(BindingFrozenColumnsProperty, value);
  42.         }

  43.         // Using a DependencyProperty as the backing store for BindingFrozenColumns.  This enables animation, styling, binding, etc...
  44.         public static readonly DependencyProperty BindingFrozenColumnsProperty =
  45.             DependencyProperty.RegisterAttached("BindingFrozenColumns", typeof(int), typeof(C1FlexGridExtensions), new PropertyMetadata(0, BindingFrozenColumnsChanged));

  46.         private static void BindingFrozenColumnsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  47.         {
  48.             if (e.NewValue != null)
  49.             {
  50.                 var c1FlexGrid = d as C1FlexGrid;
  51.                 if (c1FlexGrid != null)
  52.                 {
  53.                     c1FlexGrid.FrozenColumns = Convert.ToInt32(e.NewValue);
  54.                 }
  55.             }
  56.         }
  57.     }
复制代码


  1. <c1:C1FlexGrid x:Name="_flexFinancial"
  2.                                                    HorizontalAlignment="Left"
  3.                                                    AutoGenerateColumns="False"
  4.                                                    IsReadOnly="true"
  5.                                                    ItemsSource="{Binding GridItemSource}"
  6.                                                    MaxColumnWidth="150"
  7.                                                    MinColumnWidth="10"
  8.                                                    Style="{StaticResource C1FlexGridStyle1}"
  9.                                                    common:C1FlexGridExtensions.BindingColumns="{Binding BindingColumnsConfig}"
  10.                                                    common:C1FlexGridExtensions.BindingFrozenColumns="{Binding BindingFrozenColumns}">
  11.                                         <c1:C1FlexGridFilterService.FlexGridFilter>
  12.                                             <c1:C1FlexGridFilter />
  13.                                         </c1:C1FlexGridFilterService.FlexGridFilter>
  14.                                     </c1:C1FlexGrid>
复制代码

  1. public class GridItemInfo : IItemInfo
  2.     {
  3.         public int Id { get; set; }
  4.         public double ItemWidth { get; set; }
  5.         public double ItemHeight { get; set; }
  6.         public string ItemTitle { get; set; }
  7.         public ObservableCollection<SponsorData> GridItemSource { get; set; }
  8.         public ObservableCollection<ColumnConfig> BindingColumnsConfig { get; set; }
  9.         public int BindingFrozenColumns { get; set; }
  10.         public bool CanSetting { get; set; }
  11.         public bool CanCopy { get; set; }
  12.         public bool CanExportExcel { get; set; }
  13.         public bool CanExportPicture { get; set; }
  14.         public bool CanLookOriginalData { get; set; }
  15.         public bool CanDelete { get; set; }
  16.     }
复制代码

  1. for (int i = 0; i < timeDimensions.Count(); i++)
  2.                 {
  3.                     timeDimensions[i] = timeDimensions[i].Substring(0, 1).ToUpperInvariant() + timeDimensions[i].Substring(1, timeDimensions[i].Length - 1);
  4.                     bindingColumns.Add(new ColumnConfig { ColumnName = timeDimensions[i], HeaderName = timeDimensions[i], Width = timeDimensions[i].Length * 15, FormatString = "" });
  5.                 }
  6. gridItem.BindingFrozenColumns = dimensions.Count();
  7.                 gridItem.BindingColumnsConfig = bindingColumns;
复制代码

评分

参与人数 1金币 +200 收起 理由
Alice + 200 反馈解决方案。赠送200金币奖励

查看全部评分

回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-12-1 11:01:00
地板
感谢及时回复,看到前搞定了,朋友告诉我用了附加属性弄的,这样VM里不会出现任何和控件相关的属性,PCL的VM和View 不在一个项目里,夹杂了一些业务上的东西,不是太全,但是大概意思到了
[code]
public class Co......
heyixiaoran 发表于 2014-11-28 18:14:00


感谢您的反馈,为其他人解决问题提供思路。
稍后会赠送金币作为奖励。

也欢迎你为本次服务评分。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
szpzr
高级会员   /  发表于:2023-5-10 15:29:52
5#
请问老师:ItemsSource="{Binding Path=Records}" 中的 Records 如何定义?
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-10 17:53:33
6#
这个Records就是你在VM中定义的的那个ObservableCollection<Record>




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部