这听起来很奇怪,但我不知道该怎么做,尽管我已经阅读了很多关于它的文章和答案。 这个似乎是最明确的,但不幸的是它对我没有帮助。
所以我有一系列标签应该在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”
希望你能帮助我,学习很难,但我很努力
答案 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)