【发布时间】:2012-02-01 10:27:08
【问题描述】:
我在我的 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 中。
但是,在我的应用程序中,有一个新的“轮询”实例应用于 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 返回一个 Polling 对象,它提供了一个整数属性 Progress,它提供了我想在 ProgressBar 中显示的信息。 (这里可能会产生误导,Polling 是我的 DependencyProperty 的名称以及我的类的名称)。
就这一点而言,一切似乎都很好,并且绑定到 Polling.Progress 有效。
在第一个操作完成后触发的事件 ConvertFinished() 中,我得到一个新的 Polling 实例返回并希望从那时起在 Binding 中使用它。
private void ConvertFinished(object result)
{
Polling = Document.Format((byte[])result, FormatFinished);
}
对我的 Polling DependencyProperty 进行此分配后,Binding 不再更新并保持其先前的值。
【问题讨论】:
-
我将其添加到答案中只是为了便于阅读。顺便说一句,您可以从 ConvertFinished 访问您的 UI 吗?
-
是的,我回到了那里的 UI 线程,可以直接执行任何操作。
-
强制 Progress 为 0 有效吗?
-
在分配新值之前将其强制为 0 有效,是的。但是新实例在使用后,变化仍然不会出现。
-
如果是粘性绑定,唯一摆脱的方法是使用数据源的深度克隆 - 您考虑过吗?
标签: c# wpf binding dependencies properties