我在我的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不再更新并保持其先前的值。
答案 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(); }
}