如何更新标签数组

时间:2015-04-21 11:28:03

标签: c# wpf label

这听起来很奇怪,但我不知道该怎么做,尽管我已经阅读了很多关于它的文章和答案。 这个似乎是最明确的,但不幸的是它对我没有帮助。

Like this

所以我有一系列标签应该在for循环期间更新:

public const int NUM_OF_PAGES = 128;
...
    int[] PEcnt = new int[NUM_OF_PAGES];
    Label[] PElabels = new Label[NUM_OF_PAGES]; 
    for (int i = 0; i < NUM_OF_PAGES; i++) // initialization
    {
        PEcnt[i] = 0;
        PElabels[i] = new Label();
        PElabels[i].Content = 0;
        PElabels[i].Margin = new Thickness(50 + 80 * (i % 16), 50 + 20 * (i / 16), 0, 0);
        Grid1.Children.Add(PElabels[i]);
}
...
for (int i = 0; i < NUM_OF_PAGES; i++)
{
    PEcnt[i] += 2;
    PElabels[i].Content = PEcnt[i];
    BindingOperations.GetBindingExpressionBase(PElabels[i], Label.ContentProperty).UpdateTarget(); //trying to update
}

但这会抛出“System.NullReferenceException”

希望你能帮助我,学习很难,但我很努力

2 个答案:

答案 0 :(得分:0)

不要.UpdateTarget();它应该没问题我相信

你不需要为此获取绑定表达式,如果你正在使用它,那么这里不更新目标。

答案 1 :(得分:-1)

所以首先: Label.Content 属性存储一个对象!因此,您可以在其中存储 Integer 而无需强制转换!

您正在尝试更新 NOTbinded 属性上的 BindingExpression

所以你应该解决问题的方法是更新它。 因为您的Label没有使用任何绑定,所以您调用的函数返回 null

所以只需将 Integer 存储在content属性和YOLO中。这是工作代码:

public const int NUM_OF_PAGES = 128;
Label[] PElabels = new Label[NUM_OF_PAGES];

...

for (int i = 0; i < NUM_OF_PAGES; i++) // initialization
{
    PElabels[i] = new Label();

    PElabels[i].Content = 0; //Storing your Data as int in object

    PElabels[i].Margin = new Thickness(50 + 80 * (i % 16), 50 + 20 * (i / 16), 0, 0);
    Grid1.Children.Add(PElabels[i]);
}

...


for (int i = 0; i < NUM_OF_PAGES; i++)
{
    PElabels[i].Content = (int)PElabels[i].Content + 2; //Storing your new Data
}

<强> SO !!!! 如果您真的需要使用此更新绑定,则必须将content属性设置为Binding。为此,您必须将数据存储在某些属性中,例如Label.DataContext中。现在,您需要将Binding(指向DataContext)设置为Label.ContentProperty。完成后,您可以更新 BindingExpression ,标签将会更改。

此处的工作代码:

public const int NUM_OF_PAGES = 128;
Label[] PElabels = new Label[NUM_OF_PAGES];

...

for (int i = 0; i < NUM_OF_PAGES; i++) // initialization
{
    PEcnt[i] = 0;
    PElabels[i] = new Label();

    PElabels[i].DataContext = 0; //Storing your Data
    Binding PEcntBind = new Binding("DataContext");
    PEcntBind.Source = PElabels[i];
    PElabels[i].SetBinding(Label.ContentProperty, PEcntBind); //Binding to your stored Data

    PElabels[i].Margin = new Thickness(50 + 80 * (i % 16), 50 + 20 * (i / 16), 0, 0);
    Grid1.Children.Add(PElabels[i]);
}

...

for (int i = 0; i < NUM_OF_PAGES; i++)
{
    PEcnt[i] += 2;
    PElabels[i].DataContext = PEcnt[i]; //Storing your new Data

    BindingExpression LabBindEx = (PElabels[i] as FrameworkElement).GetBindingExpression(Label.ContentProperty);
    LabBindEx.UpdateTarget(); //Updating the Bindings
}

(哦,顺便说一句,你必须使用GetBindingExpression而不是GetBindingExpressionBase)