XamDataGrid (2011–2012): как динамически заменить преобразователь полей + параметры поля с помощью XAML?

У меня есть 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, но по пути Я застрял и сейчас не могу понять, как лучше всего достичь того, чего я хочу.

У кого-нибудь есть хорошее решение для этого?


person norgie    schedule 05.10.2015    source источник
comment
Вы пробовали использовать триггеры?   -  person torvin    schedule 06.10.2015
comment
Нет, но я посмотрю.   -  person norgie    schedule 07.10.2015


Ответы (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;

Я генерирую fieldlayout во время выполнения для моей сетки. А также с использованием "DataRecordCellAreaStyle", "CellValuePresenterStyle", "LabelPresenterStyle" во время выполнения. Это дает вам гибкость для очень легкой перестановки различных стилей/конвертеров, и это довольно легко реализовать и изменить.

person Kylo Ren    schedule 30.12.2015