C# 当DataContext更改时立即更新绑定
我试图在更改DataContext后立即测量对象,但是对象的绑定没有得到足够快的更新。这是我的密码:C# 当DataContext更改时立即更新绑定,c#,.net,wpf,data-binding,C#,.net,Wpf,Data Binding,我试图在更改DataContext后立即测量对象,但是对象的绑定没有得到足够快的更新。这是我的密码: // In MeasureOverride(Size) m_inputWidth = 0.0; Size elemSize = new Size(double.PositiveInfinity, RowHeight); MapElementView ruler = new MapElementView(); // Measure inputs foreach (MapElementViewM
// In MeasureOverride(Size)
m_inputWidth = 0.0;
Size elemSize = new Size(double.PositiveInfinity, RowHeight);
MapElementView ruler = new MapElementView();
// Measure inputs
foreach (MapElementViewModel elem in m_vm.InputElements)
{
ruler.DataContext = elem;
ruler.Measure(elemSize);
m_inputWidth = Math.Max(m_inputWidth, ruler.DesiredSize.Width);
}
我希望视图对象的绑定更新,以便可以测量视图需要多大才能显示ViewModel。我重复使用相同的视图进行测量,因为我正在虚拟化数据
有人知道如何在DataContext更改时强制更新绑定吗
请注意,绑定最终会更新
视图包含一个TextBlock,它是根据ViewModel更改大小的主要元素。在更改DataContext后,我立即查看了该元素上TextProperty的BindingExpression,但调用UpdateTarget()并不能解决问题,BindingExpression.DataItem似乎为null
编辑:
BindingExpression的状态为未附加。诀窍是找出如何附加它。好吧,如果在设置DataContext之后,您以DataBind优先级调用了Dispatcher,那么应该会使它们全部更新 由于此代码是在MeasureOverride方法内执行的,因此不能对Dispatcher进行调用。相反,我会制作一个标志,指示标尺宽度是否已测量,如果未测量,则开始查看计算这些宽度的方法。然后,在计算宽度时,调用InvalidateMeasure强制进行第二次布局传递 每次这些宽度中的一个发生变化时,这将需要额外的布局过程。每当需要重新测量文本框时,您需要将标志重置为false
private bool isRulerWidthValid = false;
protected override Size MeasureOverride(Size available)
{
... // other code for measuring
if (!isRulerWidthValid)
{
Dispatcher.BeginInvoke(new Action(CalculateRulerSize));
... // return some temporary value here
}
... // do your normal measure logic
}
private void CalculateRulerSize(Size available)
{
Size elemSize = new Size(double.PositiveInfinity, RowHeight);
m_inputWidth = 0.0;
foreach (MapElementViewModel elem in m_vm.InputElements)
{
ruler.DataContext = elem;
ruler.Dispatcher.Invoke(new Action(() => { }), DispatcherPriority.DataBind);
ruler.Measure(elemSize);
m_inputWidth = Math.Max(m_inputWidth, ruler.DesiredSize.Width);
}
// invalidate measure again, as we now have a value for m_inputwidth
isRulerWidthValid = true;
InvalidateMeasure();
}
我遇到以下异常:在dispatcher处理挂起时无法执行此操作。似乎WPF在布局期间锁定了调度程序。我在MeasureOverride()中运行此代码