gpt4 book ai didi

c# - DataContext 改变时立即更新 Binding

转载 作者:太空狗 更新时间:2023-10-29 17:55:44 25 4
gpt4 key购买 nike

我试图在更改 DataContext 后立即测量对象,但对象的绑定(bind)更新不够快。这是我的代码:

// 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);
}

我希望更新 View 对象的绑定(bind),以便我可以测量 View 需要多大才能显示 ViewModel。我正在重复使用相同的 View 进行测量,因为我正在虚拟化数据。

有谁知道如何在 DataContext 更改时强制更新绑定(bind)?

请注意,绑定(bind)最终会更新。

View 包含一个 TextBlock,它是根据 ViewModel 更改大小的主要元素。在更改 DataContext 后,我​​立即查看了此元素上 TextProperty 的 BindingExpression,但调用 UpdateTarget() 并未解决问题,BindingExpression.DataItem 似乎为空。

编辑:BindingExpression 的状态为未附加。诀窍是弄清楚如何附加它。

最佳答案

好吧,如果在设置 DataContext 之后,您以 DataBind 优先级对 Dispatcher 进行了调用,它应该会导致它们全部更新。

由于此代码是在 MeasureOverride 方法内执行的,因此您不能对 Dispatcher 执行调用。相反,我会制作一个标志,指示是否测量了标尺宽度,如果没有,则对计算这些宽度的方法执行 BeginInvoke。然后,在计算宽度时,调用 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();
}

关于c# - DataContext 改变时立即更新 Binding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/662892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com