依赖属性绑定-分配一个新值
本文关键字:一个 新值 属性 绑定 分配 依赖 | 更新日期: 2023-09-27 18:19:13
我已经在我的WPF控件上实现了一个简单的DependencyProperty,以便在绑定中使用它。
public static readonly DependencyProperty PollingProperty = DependencyProperty.Register("Polling", typeof(Polling), typeof(ConverterView), new UIPropertyMetadata(null));
public Polling Polling
{
get { return (Polling)GetValue(PollingProperty); }
set { SetValue(PollingProperty, value); }
}
控件本身被设置为DataContext,所以在XAML中我只是这样使用它:
<ProgressBar Height="25" Value="{Binding Path=Polling.Progress, Mode=OneWay}" />
轮询。Progress是一个实现INoftiyPropertyChanged的整数属性,因此更改会被提升到UI。一切工作正常,"进度"上的更改如预期的那样显示在进度条中。
然而,在我的应用程序中,有一个新的"轮询"实例应用于DependencyProperty.
Polling = new Polling(); Polling.Start();
之后,不再计算绑定,ProgressBar保持在旧实例的最后一个值。
更新:
由于我的情况可能有点特殊,我将多解释一点。
我的ConverterView WPF-Control上的一个按钮允许用户开始操作:
private void cmdAusformatieren_Click(object sender, RoutedEventArgs e)
{
Polling = Document.Converter(ConvertFinished);
}
转换方法以委托作为参数,该委托将在操作完成后调用。(整个过程是异步运行的。)Convert-Method返回一个Polling对象,该对象提供一个整数属性Progress,它提供了我想要在ProgressBar中显示的信息。(这里可能会产生误导,Polling是我的DependencyProperty的名称以及我的类的名称)。
到目前为止,一切似乎都很好,绑定到轮询。工作进展。
在第一个操作完成后触发的事件ConvertFinished()中,我得到一个新的Polling实例返回,并希望从那时起在Binding中使用它。
private void ConvertFinished(object result)
{
Polling = Document.Format((byte[])result, FormatFinished);
}
在分配给我的Polling DependencyProperty之后,Binding不再更新,并保持其先前的值。
代替
Polling = new Polling () ;
你需要写
SetCurrentValue (PollingProperty, new Polling ()) ;
当你直接分配一个依赖属性时,它的所有绑定都会丢失。OTOH SetCurrentValue
不影响绑定,它只是设置当前值(duh)并传播通知。
在这种情况下,最简单的解决方案是此时从运行时的代码中重新分配一个binding
。因为,正如您所注意到的,绑定保存了一个引用到它第一个分配的对象。
好的,你可以试试这个吗:
BindingOperations.ClearBinding(这一点。YouProgressBarName ProgressBar.ValueProperty);BindingOperations.SetBinding(这一点。YouProgressBarName ProgressBar.ValueProperty);
先看,检查它是否有效。我预测不会。
有一件事我建议改变-摆脱子属性(我理解您使用复杂对象来减少del中的参数数量)。WPF框架对它们的支持有限。
我想尝试的另一件事是强迫你的轮询属性值为0之前分配一个新的值给它
private void cmdAusformatieren_Click(object sender, RoutedEventArgs e)
{
this.Polling.Progress = 0; // see if make any difference
this.Polling = Document.Converter(ConvertFinished);
if (this.Polling.Progress != 0) { throw new Exception(); }
}