DependencyProperty绑定错误,以编程方式

时间:2014-03-18 12:01:44

标签: c# wpf binding datagrid user-controls

我所拥有的是一个运行良好的C#和XAML代码,它完全按照预期的方式完成。我正在尝试为DependencyProperty制作我的自定义工作UserControl - 并且它已经制作完成,并且可以正常工作。有两个属性:SumOfApproximationsPropertySumOfPositionsProperty。这些getter和setter根本不会在某些操作上被调用 - 这是我的问题。它们在此UserControl类中声明:

public partial class PresentationCell : UserControl
{
    public Label SumOfApproximations;
    public Label SumOfPositions;
    public PresentationCell()
    {
        InitializeComponent();
        DataContext = this;
        this.MinHeight = 40;
        this.MinWidth = 40;
        SumOfApproximations = this.SumOfApproximation;
        SumOfPositions = this.SumOfPosition;
    }

    public static readonly DependencyProperty SumOfApproximationsProperty =
    DependencyProperty.Register("AproximationsProperty", typeof(String),
    typeof(PresentationCell), new UIPropertyMetadata(null));

    public static readonly DependencyProperty SumOfPositionsProperty =
    DependencyProperty.Register("PositionsProperty", typeof(String),
    typeof(PresentationCell), new UIPropertyMetadata(null));

    public String AproximationsProperty
    {
        get { return (String)GetValue(SumOfApproximationsProperty); }
        set { SetValue(SumOfApproximationsProperty, value); }
    }

    public String PositionsProperty
    {
        get { return (String)GetValue(SumOfPositionsProperty); }
        set { SetValue(SumOfPositionsProperty, value); }
    }
}

正如您所看到的,它由两个Labels组成,它们具有自己的文本设置属性。这是UserControl XAML:

// USER CONTROL XAML
<UserControl x:Class="PodstawyModelowaniaISymulacjiRozmytej.Controls.PresentationCell"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*">
            </ColumnDefinition>
            <ColumnDefinition Width="2*">
            </ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Grid Grid.Column="0">
            <Grid.RowDefinitions>
                <RowDefinition Height="1*">
                </RowDefinition>
                <RowDefinition Height="2*">
                </RowDefinition>
            </Grid.RowDefinitions>

            <Grid Grid.Row="0">
                <Label Name="SumOfApproximation" Content="{Binding Path=AproximationsProperty}">
                </Label>
            </Grid>
            <Grid Grid.Row="1">

            </Grid>
        </Grid>

        <Grid Grid.Column="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="1*">
                </RowDefinition>
                <RowDefinition Height="2*">
                </RowDefinition>
            </Grid.RowDefinitions>

            <Grid Grid.Row="0">

            </Grid>
            <Grid Grid.Row="1">
                <Label  Name="SumOfPosition"></Label>
            </Grid>
        </Grid>
    </Grid>
</UserControl>

UserControl将与DataGrid(因为它的单元格)一起使用,它在下面声明(在XAML中):

// MAIN WINDOW DATAGRIG DECLARATION MAINWINDOW.XAML
<Grid Grid.Row="2" Name="DataThree_Grid">
    <DataGrid Name="ResultData_DataGrid" HeadersVisibility="Row" Margin="5 5 5 5"></DataGrid>
</Grid>

这是代码,它准备并在此DataGrid中创建一个填充PresentationCell UserControls的列:

// MAIN WINDOW CREATE COLUMN FOR DATAGRID FUNCTION MAINWINDOW.XAML.CS
private DataGridTemplateColumn CreatePresentationTemplateColumn(Binding positions, Binding aproximations)
{
    DataGridTemplateColumn doubleOnlyTextBoxColumn = new DataGridTemplateColumn();
    FrameworkElementFactory factory = new FrameworkElementFactory(typeof(PresentationCell));
    DataTemplate dataTemplate = new DataTemplate();

    factory.SetValue(PresentationCell.SumOfApproximationsProperty, aproximations);
    factory.SetValue(PresentationCell.SumOfPositionsProperty, positions);
    dataTemplate.VisualTree = factory;
    doubleOnlyTextBoxColumn.CellTemplate = dataTemplate;
    return doubleOnlyTextBoxColumn;
}

其他代码,可以认为对您回答此问题很有用:

// MAIN WINDOW INITIALIZING BUTTON MAINWINDOW.XAML.CS
private void SubtractionLR_Button_Click(object sender, RoutedEventArgs e)
{
    MyData[]  table = new MyData[] 
    { 
        new MyData 
        { 
            Values = new element[2] 
            { 
                new element 
                { 
                    var1 = 7, 
                    var2 = 6 
                }, 
                new element 
                { 
                    var1 = 4, 
                    var2 = 1 
                } 
            } 
        }, 
        new MyData 
        { 
            Values = new element[2]
            { 
                new element 
                { 
                    var1 = 67, 
                    var2 = 3 
                }, 
                new element 
                { 
                    var1 = 44, 
                    var2 = 1 
                } 
            } 
        } 
    };
    fillPresentationDataGrid(ResultData_DataGrid, table);
}

现在,在描述了所有代码之后,问题仍然存在。正如您所看到的,我正在尝试为PresentationCell UserControls列创建Binding对象。问题是,这个Binding中的String对我来说是未知的 - 它的规范等等。因此,程序无法通过此绑定找到应提供给我的控件(及其标签)的数据。数据应来自MyData[] table。程序显示错误&#34;找不到值&#34;等DataGrid中的单元格为空白。

// MAIN WINDOW FILLING PRESENTATION GRID FUNCTION MAINWINDOW.XAML.CS
private void fillPresentationDataGrid(DataGrid dataGrid, MyData[] table)
{
    dataGrid.AutoGenerateColumns = false;
    for (int i = 0; i < table[0].Values.Length; i++)
    {

        DataGridTemplateColumn col = CreatePresentationTemplateColumn(new Binding("Values[" + i + "].var1"), new Binding("Values[" + i + "].var2"));
        dataGrid.Columns.Add(col);
    }
    dataGrid.ItemsSource = table;
}

修改

我想要的是使用我自己的自定义MyData[] tableDataGrid控件上显示UserControl个内容。当我将factory.SetValue(PresentationCell.SumOfApproximationsProperty, aproximations);更改为factory.SetValue(PresentationCell.SumOfApproximationsProperty, "foo");时,DataGrid将显示&#34; foo&#34;&#39; s。


EDIT2

不幸的是,问题仍然存在。

1 个答案:

答案 0 :(得分:0)

在PresentationCell的构造函数中,您设置this.DataContext = this。 通过将DataContext设置为您的控件,您将破坏此属性的继承,这就是为什么在CreatePresentationTemplateColumn中设置绑定不起作用。 要解决此问题,您可以删除此行并使用RelativeSource / ElementName绑定控件,或者您可以将dataContext设置为PresentationCell中的主网格而不是根级别