Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当DataContext更改时立即更新绑定_C#_.net_Wpf_Data Binding - Fatal编程技术网

C# 当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

我试图在更改DataContext后立即测量对象,但是对象的绑定没有得到足够快的更新。这是我的密码:

// 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()中运行此代码