如何将XAML中设置的依赖项属性覆盖到代码隐藏中需要的值

时间:2014-01-30 22:28:36

标签: c# wpf dependency-properties infragistics xamdatagrid

我有一个为XamDatagrid定义的依赖项属性RecordContainerGenerationMode,无论用户在XAML中设置什么,我都需要它默认为特定值PreLoad。

我如何做到这一点? Xamdatagrid是一个infragistics网格,它真的允许我隐藏依赖项实现。

我尝试在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);            
    }

有没有人在任何地方遇到过这种问题?

1 个答案:

答案 0 :(得分:0)

我不确定你为什么要这样做。像Anatolii Gabuza说的那样,那里有明确的代码味道。这是你需要重新思考的东西。

生成所有内容的方法是构造控件(调用默认构造函数),然后分配XAML中的属性,然后如果有数据绑定,则在运行时更新值。

如果您不希望更改该值,最简单的方法就是不要公开它!如果您需要读取值,也许您可​​以尝试只读依赖项属性。

如果您真的希望它公开Dependency属性,您可以在属性更改事件中设置它。但是,这种方式首先打破了依赖属性的目的。

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;
        }
    }
}