依赖属性绑定-分配一个新值

本文关键字:一个 新值 属性 绑定 分配 依赖 | 更新日期: 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(); }
}
相关文章: