【问题标题】:XamDataGrid (2011 - 2012): How do I replace a fields converter + fieldsettings dynamically using XAML?XamDataGrid (2011 - 2012):如何使用 XAML 动态替换字段转换器 + 字段设置?
【发布时间】:2015-10-05 22:28:07
【问题描述】:

我有一个 XamDataGrid,其中包含一些字段,包括这两个:

<igDP:Field Name="MinValue" Label="Min." Converter="{StaticResource DivideBy1000Converter}" Column="5">
    <igDP:Field.Settings>
        <igDP:FieldSettings CellWidth="60" 
                            AllowEdit="True" 
                            CellValuePresenterStyle="{StaticResource minValueCellEnabled}" 
                            EditAsType="{x:Type System:String}" 
                            EditorStyle="{StaticResource DecimalMWhStyle}" 
                            CellClickAction="EnterEditModeIfAllowed" />
    </igDP:Field.Settings>
</igDP:Field>
<igDP:Field Name="MaxValue" Label="Max." Converter="{StaticResource DivideBy1000Converter}" Column="6">
    <igDP:Field.Settings>
        <igDP:FieldSettings CellWidth="60" 
                            AllowEdit="True" 
                            CellValuePresenterStyle="{StaticResource maxValueCellEnabled}" 
                            EditAsType="{x:Type System:String}" 
                            EditorStyle="{StaticResource DecimalMWhStyle}" 
                            CellClickAction="EnterEditModeIfAllowed" />
    </igDP:Field.Settings>
</igDP:Field>

由于不断变化的需求和一点时间压力,我需要找到一种方法来动态更改字段的转换器和 EditorStyle,具体取决于存在的某个值(最有可能是布尔标志)。我已经看到了使用样式选择器的一般示例,但没有看到如何(如果可能的话)将样式选择器应用于 XamDataGrid 的元素。我最初的想法是使用样式选择器类并为每种情况添加两种样式,即一种用于当字段应使用 DivideBy1000Converter + DecimalMWhStyle 组合时,另一种用于当字段应使用空转换器和 PercentageStyle,但沿途我被卡住了,我现在不知道如何最好地实现我想要的。

有人有好的解决办法吗?

【问题讨论】:

  • 你试过使用触发器吗?
  • 不,但我会看看。

标签: c# wpf xaml xamdatagrid


【解决方案1】:

使用行为快速做到这一点。

只需在 XAML 代码中构建所有样式和字段布局,并在行为中使用它们。看看下面的代码:

FieldLayout sourceFieldLayout = (Infragistics.Windows.Utilities.GetAncestorFromType(this.AssociatedObject, typeof(LocationMatchingView), false) as LocationMatchingView).Resources["LocationMatchingSourceFieldlayout"] as FieldLayout;
            foreach (Field field in sourceFieldLayout.Fields)
            {
                Field newField = new Field(field.Name, field.Label);
                newField.Tag = field.Tag;
                newField.Width = field.Width;
                newField.Settings.CellValuePresenterStyle = field.Settings.CellValuePresenterStyle;
                fieldLayout.Fields.Add(newField);
            }

            fieldLayout.Settings.DataRecordCellAreaStyle =
                                    (Infragistics.Windows.Utilities.GetAncestorFromType(this.AssociatedObject, 
                                    typeof(LocationMatchingView), false) as LocationMatchingView).Resources["CAMDataRecordCellAreaStyle"] as Style;
            fieldLayout.Settings.AutoGenerateFields = false;
            fieldLayout.Settings.FilterUIType = FilterUIType.LabelIcons;
            fieldLayout.Settings.AllowFieldMoving = AllowFieldMoving.WithinLogicalRow;
            fieldLayout.FieldSettings.CellValuePresenterStyle =
                                    (Infragistics.Windows.Utilities.GetAncestorFromType(this.AssociatedObject, 
                                    typeof(LocationMatchingView), false) as LocationMatchingView).Resources["CAMCellValuePresenterStyle"] as Style;
            fieldLayout.FieldSettings.LabelTextAlignment = System.Windows.TextAlignment.Center;
            fieldLayout.FieldSettings.LabelTextWrapping = TextWrapping.Wrap;
            fieldLayout.FieldSettings.LabelTextAlignment = TextAlignment.Justify;
            fieldLayout.FieldSettings.LabelClickAction = LabelClickAction.SortByOneFieldOnly;
            fieldLayout.FieldSettings.AllowRecordFiltering = true;
            fieldLayout.FieldSettings.FilterLabelIconDropDownType = FilterLabelIconDropDownType.MultiSelectExcelStyle;
            fieldLayout.FieldSettings.AllowEdit = false;
            fieldLayout.FieldSettings.LabelPresenterStyle = 
                                        (Infragistics.Windows.Utilities.GetAncestorFromType(this.AssociatedObject, 
                                            typeof(LocationMatchingView), false) 
                                            as LocationMatchingView).Resources["LocationMatchingLabelPresenterStyle"] as Style;
            fieldLayout.FieldSettings.AllowFixing = AllowFieldFixing.NearOrFar;
            fieldLayout.Settings.FixedFieldUIType = FixedFieldUIType.Splitter;
            fieldLayout.Settings.AllowClipboardOperations = AllowClipboardOperations.Copy;

我在运行时为我的网格生成字段布局。并且还在运行时使用“DataRecordCellAreaStyle”、“CellValuePresenterStyle”、“LabelPresenterStyle”。这使您可以灵活地非常轻松地置换不同的样式/转换器,并且非常容易实现和更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多