依赖项属性绑定 - 分配新值

时间:2012-01-03 11:02:48

标签: c# wpf binding dependencies properties

我在我的WPF控件上实现了一个简单的DependencyProperty,以便在Binding中使用它。

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}" />

Polling.Progress是一个实现INoftiyPropertyChanged的整数属性,因此更改会提升到UI。一切正常,ProgressBar中的“Progress”更改按预期显示。

然而,在我的应用程序中有一点是将新的“轮询”实例应用于DependencyProperty。

Polling = new Polling(); Polling.Start();

之后,不再评估绑定,并且ProgressBar保持在旧实例的最后一个值。

更新

由于我的情况可能有点具体,我会再解释一下。

我的ConverterView WPF-Control上的一个按钮允许用户启动操作:

private void cmdAusformatieren_Click(object sender, RoutedEventArgs e)
{
    Polling = Document.Converter(ConvertFinished);
}

Convert-method将一个委托作为参数,在操作完成后将调用该参数。 (整个过程以异步方式运行。) Convert-Method返回轮询 - 对象,它提供整数属性Progress,它提供我想要在ProgressBar中显示的信息。 (这里可能有误导性,Polling是我的DependencyProperty的名字以及我班级的名字。)

就此而言,一切似乎都可以,并且Polling.Progress的绑定可以正常工作。

在我完成第一个操作完成后触发的事件ConvertFinished()中,我返回了一个新的Polling实例,并希望从那时开始在Binding中使用它。

private void ConvertFinished(object result)
{           
    Polling = Document.Format((byte[])result, FormatFinished);
}

在我的Polling DependencyProperty分配后,Binding不再更新并保持其先前的值。

3 个答案:

答案 0 :(得分:1)

而不是

Polling = new Polling () ;

你需要写

SetCurrentValue (PollingProperty, new Polling ()) ;

直接分配依赖属性时,其上的所有绑定都将丢失。 OTOH SetCurrentValue不会影响绑定,它只是设置当前值(duh)并传播通知。

答案 1 :(得分:0)

在这种情况下,最简单的解决方案是重新分配一个binding,此时从运行时的代码开始。原因,正如您所指出的那样,绑定将引用保存到首先分配的对象。

答案 2 :(得分:0)

好的,你能试试吗:

BindingOperations.ClearBinding(this.YouProgressBarName,ProgressBar.ValueProperty); BindingOperations.SetBinding(this.YouProgressBarName,ProgressBar.ValueProperty);

首先检查它是否有效。我预测它不会。

我建议改变一件事 - 摆脱子属性(我知道你使用复杂的对象来减少你的dels中的数字参数)。他们对WPF框架的支持有限。

我尝试的另一件事是在为其分配新值之前将Polling属性值强制为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(); }
}