WPF如何绑定到私有变量

时间:2011-10-05 12:57:43

标签: wpf binding

有人请帮我解决这个问题。我有一个数据网格,我需要一切都具有完全可扩展的大小。我对列标题没有任何问题,它们都可以正确缩放。我的问题是针对个体细胞,他们似乎并不尊重他们的约束力。

我必须将DataGridTextColumn子类化以添加一些自定义功能。我有一个名为CreateDataGridColumn的方法,它返回对ExtendedDataGridTextColumn的引用。然后将这些列添加到数据网格中。数据绑定本身工作正常,网格显示所有正确的数据。网格高度的绑定似乎设置初始值很好,但是一旦显示网格,如果绑定的变量发生变化,它就不会改变高度。

以下是一些代码:

    private ExtendedDataGridTextColumn CreateDataGridColumn(EntityBase dataColumn, FormatConditionGroup formatConditionGroup)
    {
        ExtendedDataGridTextColumn newColumn = new ExtendedDataGridTextColumn(dataColumn);
        DataTemplate dataTemplate = new DataTemplate();
        String textBlockName = "Text" + dataColumn.EntityId;
        String columnTag = dataColumn.GetPropertyValue("Tag");

        // Create the TextBlock that will display the cell contents
        FrameworkElementFactory textBlockFNFactory;
        textBlockFNFactory = new FrameworkElementFactory(typeof(TextBlock));

        _gridTextHeightPercentage = dataColumn.GetPropertyDouble("GridFontSize", Constants.DefaultFontHeightPercent) / 2.8;
        _fontSize = GlobalVariables.DesignerPreviewHeight * (_gridTextHeightPercentage / 100);

        Binding binding = new Binding();
        binding.Source = _fontSize;
        textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding);

        // Do a whole bunch of stuff here

        // Create a border so that the label background does not obscure the grid lines
        FrameworkElementFactory borderFNFactory;
        borderFNFactory = new FrameworkElementFactory(typeof(Border));
        borderFNFactory.AppendChild(textBlockFNFactory);

        // Add type to data template
        dataTemplate.VisualTree = borderFNFactory;

        newColumn.CellTemplate = dataTemplate;

        return newColumn;
    }

然后我在datagrid的SizeChanged事件上触发了以下方法:

        _customDataGrid.TitleAreaHeight = new GridLength(GlobalVariables.DesignerPreviewHeight * (_titleHeightPercentage / 100));
        _customDataGrid.SetHeaderFontSize(GlobalVariables.DesignerPreviewHeight * (_headerHeightPercentage / 100));
        _fontSize = GlobalVariables.DesignerPreviewHeight * (_gridTextHeightPercentage / 100); 

前两行执行它们应该的操作,更改标题区域的高度,这是我添加到数据网格中并更改标题高度。但_fontSize变量的更新不会更改数据网格单元格文本高度。

更新

根据建议我添加了依赖属性。

    public static readonly DependencyProperty GridFontHeightProperty = DependencyProperty.Register("GridFontHeight", typeof(double), typeof(CustomDataGrid));

然后将我的绑定代码更改为此。

        binding = new Binding();
        binding.Path = new PropertyPath("GridFontHeight");
        textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding);

然后在我的尺寸改变了这个。

        SetValue(GridFontHeightProperty, _fontSize);

但它不起作用。在这种情况下,它没有正确设置字体高度,它只使用数据网格的默认字体高度。

3 个答案:

答案 0 :(得分:1)

首先,不能绑定到私有变量。我的猜测是,你的变量_fontSize是private double,对吗? (看看我怎么猜?)) 您可以绑定到公共属性或依赖属性,在您的情况下适合。因此,创建一个名为FontSize的新依赖项属性并绑定到该属性。

如果由于某种原因你不能使用依赖属性,你仍然可以使用INotifyPropertyChanged绑定到普通的CLR属性,它应该类似于

public double FontSize
{
    get{return _fontSize;}
    set
    {
        _fontSize = value;
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("FontSize"));
        }
    }
}

答案 1 :(得分:0)

你没有正确装订,也不能(严格地说)你想要的东西。

绑定总是针对普通代码属性或针对依赖项属性。您无法绑定到字段。你可以这样做:

首先,删除_fontSize实例变量。你不会再使用它了。

接下来,为此值定义DependencyProperty

    private const string FontSizePropertyName = "FontSize";
    private static readonly DependencyProperty FontSizeProperty = 
    DependencyProperty.Register(
        FontSizePropertyName,
        typeof(double),
        typeof(ExtendedDataGridTextColumn),
        new UIPropertyMetadata(0));
    private double FontSize
    {
        get { return (double)GetValue(FontSizeProperty); }
        set { SetValue(FontSizeProperty, value); }
    }

然后将绑定更改为:

    Binding binding = new Binding();
    binding.Source = RelativeSource.Self;
    binding.Path = new PropertyPath(FontSizeProperty)
    textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding);

然后只需使用新的FontSize属性来设置值,而不是更新私有字段。

注意:您与现有的依赖项属性很接近,但如果属性是CLR(普通)属性,则PropertyPath只需string。对于依赖项属性,您应该将实际的DependencyProperty实例传递给它,如上所示。

答案 2 :(得分:0)

我对此有几点意见......

  1. ExtendedDataGridTextColumn DataGridTextColumn是否延伸至CellTemplate,如果是这样,你如何使用DataGridTextColumnElementStyleEditingElementStyleCellTemplate来设置由其单元格表示的TextBlock和TextBox的样式。

  2. 如果您对上述第1点中 Binding binding = new Binding(); binding.BindsDirectlyToSource = true; binding.Source = _fontSize; textBlockFNFactory.SetBinding(TextBlock.FontSizeProperty, binding); 的决定有信心,请尝试....

    {{1}}
  3. 如果有任何帮助,请告诉我。