C# 依赖项属性绑定-指定新值

C# 依赖项属性绑定-指定新值,c#,wpf,binding,dependencies,properties,C#,Wpf,Binding,Dependencies,Properties,我在WPF控件上实现了一个简单的DependencyProperty,以便在绑定中使用它 public static readonly DependencyProperty PollingProperty = DependencyProperty.Register("Polling", typeof(Polling), typeof(ConverterView), new UIPropertyMetadata(null)); public Polling Polling { get {

我在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}" />
之后,不再计算绑定,ProgressBar保持在旧实例的最后一个值

更新:

由于我的情况可能有点具体,我会解释得更详细一些

ConverterView WPF控件上的按钮允许用户启动操作:

private void cmdAusformatieren_Click(object sender, RoutedEventArgs e)
{
    Polling = Document.Converter(ConvertFinished);
}
Convert方法将委托作为参数,该参数将在操作完成后调用。(整个过程是异步运行的。) Convert方法返回一个Polling-对象,该对象提供一个整数属性Progress,该属性提供我希望在ProgressBar中显示的信息。 (这里可能有误导性,Polling是我的从属财产的名称以及我的班级名称)

就这一点而言,一切似乎都正常,并且绑定到Polling.Progress可以工作

在第一次操作完成后触发的event ConvertFinished()中,我返回了一个新的轮询实例,并希望从此在绑定中使用它

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

将此分配给my Polling DependencyProperty后,绑定将不再更新,并保持其以前的值。

在这种情况下,最简单的解决方案是此时从运行时的代码重新分配一个
绑定。因为,正如您所注意到的,绑定包含对其第一次分配的对象的引用

在这种情况下,最简单的解决方案是在运行时从代码中重新分配一个
绑定
。因为,正如您所注意到的,绑定包含对其第一次分配的对象的引用

好的,你能试试这个吗:

BindingOperations.ClearBinding(this.YouProgressBarName、ProgressBar.ValueProperty);BindingOperations.SetBinding(this.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(); }
}

好的,你能试试这个吗:

BindingOperations.ClearBinding(this.YouProgressBarName、ProgressBar.ValueProperty);BindingOperations.SetBinding(this.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(); }
}
而不是

Polling = new Polling () ;
你需要写作

SetCurrentValue (PollingProperty, new Polling ()) ;
当您直接分配Dependence属性时,该属性上的所有绑定都将丢失。OTOH
SetCurrentValue
不影响绑定,它只是设置当前值(duh)并传播通知。

而不是

Polling = new Polling () ;
你需要写作

SetCurrentValue (PollingProperty, new Polling ()) ;

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

在单击ConverterView上的按钮后,轮询实例第一次被设置。在另一个事件创建新的轮询实例并将其分配给DP之前,一切都正常。@Roper您能从该事件处理程序发布代码吗Path=Polling.Progress'表示轮询是一个属性,而'Polling=newpolling();Polling.Start();'说是另外一回事;)@罗珀:你能发布一个简化版的代码作为你问题的更新吗?另外,当大量的“mandelbugs”是由异步调用引起的时,您能否同步运行您的操作以消除这种可能性?好的,我已经更新了上面的问题。很抱歉我之前评论中的代码格式很糟糕。由于该操作需要几分钟的时间,因为网络上的Web服务和其他机器上发生了很多事情,所以它必须是异步的。在单击ConverterView上的按钮后,第一次设置轮询实例。在另一个事件创建新的轮询实例并将其分配给DP之前,一切都正常。@Roper您能从该事件处理程序发布代码吗Path=Polling.Progress'表示轮询是一个属性,而'Polling=newpolling();Polling.Start();'说是另外一回事;)@罗珀:你能发布一个简化版的代码作为你问题的更新吗?另外,当大量的“mandelbugs”是由异步调用引起的时,您能否同步运行您的操作以消除这种可能性?好的,我已经更新了上面的问题。很抱歉我之前评论中的代码格式很糟糕。由于操作需要几分钟的时间,因为网络上的Web服务和其他机器上发生了很多事情,所以它必须是异步的。@Dmitry:这是我从我的体验中注意到的有趣的事情,不知怎的,这并不让我感到惊讶。但这非常糟糕,因为使用“粘性”绑定显示的值可能是错误的!我自己也没见过,但如果它存在的话,肯定是WPF中最糟糕的错误之一。99.9%的情况下,重新分配绑定是错误的解决方案。使用
SetCurrentValue
@我同意,我以前也有同样的问题。或者,如果轮询类是由您实现的,则可以添加reset方法以重置回初始状态。所以你不必重新分配绑定。@Dmitry:这就是我从我的体验中注意到的有趣之处,不知何故,这并不让我感到惊讶。但这非常糟糕,因为使用“粘性”绑定显示的值可以被写入