Как переопределить свойство зависимости, установленное в XAML, на значение, которое мне нужно в отделенном коде

У меня есть свойство зависимости RecordContainerGenerationMode, определенное для XamDatagrid, независимо от того, что пользователь устанавливает в XAML, мне нужно, чтобы по умолчанию было задано определенное значение PreLoad.

Как мне это сделать? Xamdatagrid — это инфраструктурная сетка, которая действительно позволяет мне скрыть реализацию зависимостей.

Я попытался установить значение в конструкторе xamdatagrid, но значение, определенное XAML, было перезаписано.

<Controls:XamDataGrid Grid.Row="1"
                  HorizontalAlignment="Stretch"
                  x:Name="gridTrdDetail"
                  DataSource="{Binding Items}"
                  SelectedRecords="{Binding SelectedObjects, Mode=TwoWay}"
                  IncludeDefaultCommands="True"
                  VerticalAlignment="Stretch"
                  ScrollingMode="Immediate" 
                  CellContainerGenerationMode="Recycle"
                  GroupByAreaMode="MultipleFieldLayoutsCompact"
                  RecordContainerGenerationMode="PreLoad" SelectedSum="{Binding Sum,Mode=OneWayToSource}"
                  IsSynchronizedWithCurrentItem="True">

и вот как я установил его в конструкторе: -

public XamDataGrid()
    {
      this.SetValue(XamDataGrid.RecordContainerGenerationModeProperty,ItemContainerGenerationMode.PreLoad);            
    }

Кто-нибудь сталкивался с такой проблемой где-нибудь?


person Nick    schedule 30.01.2014    source источник
comment
Чего вы хотите этим добиться? Похоже на запах кода..   -  person Anatolii Gabuza    schedule 31.01.2014


Ответы (1)


Я не уверен, почему вы хотите сделать что-то подобное. Как сказал Анатолий Габуза, там пахнет определенным кодом. Это то, что вам нужно действительно переосмыслить.

Все генерируется так: создается элемент управления (вызов конструктора по умолчанию), затем назначаются свойства в XAML, а затем, если есть привязки данных, значение обновляется во время выполнения.

Если вы не хотите, чтобы значение менялось, самый простой способ — просто не показывать его! Если вам нужно прочитать значение, возможно, вы можете попробовать свойство зависимостей только для чтения.

Если вы ДЕЙСТВИТЕЛЬНО хотите, чтобы он открывал свойство зависимости, вы можете установить его в событии изменения свойства. Но такой вид побеждает цель наличия свойства зависимости в первую очередь.

public static readonly DependencyProperty RecordContainerGenerationModeProperty = DependencyProperty.Register(
    "RecordContainerGenerationMode", 
    typeof(ItemContainerGenerationMode), 
    typeof(XamDataGrid), 
    new PropertyMetadata(ItemContainerGenerationMode.PreLoad, OnRecordContainerGenerationModeChanged));


private static void OnRecordContainerGenerationModeChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
    XamDataGrid control = obj as XamDataGrid;

    if (control != null)
    {
        ItemContainerGenerationMode newMode = (ItemContainerGenerationMode)args.NewValue;

        if (newMode != ItemContainerGenerationMode.PreLoad)
        {
            control.RecordContainerGenerationMode = ItemContainerGenerationMode.PreLoad;
        }
    }
}
person TTat    schedule 30.01.2014
comment
Это сторонний контроль с помощью инфрагистики, поэтому я застрял в невозможности скрыть это свойство зависимости, иначе это был бы мой подход. - person Nick; 31.01.2014
comment
Зачем вообще нужно это скрывать? Даже если вы создадите унаследованную версию этого элемента управления, что мешает кому-то использовать исходный XamDataGrid, в котором это свойство открыто? - person TTat; 31.01.2014
comment
Даже если я наследую сетку, я не думаю, что смогу скрыть уже существующее свойство зависимости, и поэтому я рассматривал этот подход, я открыт для новых идей, если вы считаете, что эта идея неверна. - person Nick; 31.01.2014
comment
Одна вещь, которую вы можете сделать, это просто создать элемент управления-оболочку и предоставить только те свойства, которые вы хотите предоставить. - person TTat; 31.01.2014