WPF Avalon向导绑定问题

3
我正在使用Avalon Wizard控件,我有很多页面,但只有2个页面出现问题,所以只包含这两个页面:
<Grid Name="MainGrid">
  <w:Wizard Name="MyWizard"
            w:Designer.PageIndex="0"
            DataContext="{Binding ElementName=MainGrid, Path=DataContext.Policy}">
    <w:WizardPage Header="Main Member"
                  MaxHeight="600"
                  AllowNext="{Binding ElementName=MainGrid, Path=DataContext.CanContinue}"
                  Name="MainPage">
      <w:WizardPage Name="DeductionPage"
                    Header="Policy Details"
                    AllowNext="{Binding ElementName=MainGrid, Path=DataContext.CanContinue}">

现在遇到的问题是,主页面的“允许下一页”功能完美运行,但是在扣除页面上,“下一页”按钮始终可用,即使将“CanContinue”属性设置为false!请注意,只有在加载第二页时,“CanContinue”才会被设置为false。
    private bool canContinue;
public bool CanContinue
{
  get { return canContinue; }
  set
  {
    canContinue = value;
    NotifyPropertyChanged("CanContinue");
  }
}

--

更新

我查看了输出窗口并发现以下异常:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=MainGrid'. BindingExpression:Path=DataContext.CanContinue; DataItem=null; target element is 'WizardPage' (Name='DeductionPage'); target property is 'AllowNext' (type 'Boolean')

这个问题出现在我的问题页面上,但是为什么只有第二个页面有问题呢?第一和第二个页面绑定到完全相同的东西上,并且第一个页面工作得非常好!

除了第一个页面外,所有页面都存在问题,所有页面都是同一层级上相同巫师的子页面。

有什么建议吗?


在调试输出窗口中是否有任何绑定错误或警告?此外,如果 CanContinuefalse,你如何从主页面转到扣除页面? - Richard Deeming
我确实遇到了一个绑定错误,但这与此对象无关。抱歉,我应该澄清一下,只有在显示第二页时CanContinue才会变为false。 - Chrisjan Lodewyks
1个回答

0

没有看到 CanContinue 的代码,这只是一个猜测。然而,在这些情况下,罪魁祸首通常是由于某个属性没有引发 INotifyPropertyChanged 事件。在你的情况下,属性 CanContinue 必须引发 INotifyPropertyChanged 事件。

本质上,每当需要评估 CanContinue 的值时,都必须引发 INotifyPropertyChanged。这将向 UI 发出信号,表明 CanContinue 的值已更改,UI 必须重新评估绑定。

通常情况下,INotifyPropertyChanged 是在属性本身之外引发的。比如当方法执行一些工作导致需要确保 UI 仍然正确绑定时。在你的情况下,可能是在页面之间导航时。


抱歉,我在问题中包含了代码。NotifyPropertyChanged已经实现了。仍然出现相同的问题! - Chrisjan Lodewyks
检查是否需要在其他地方调用INotifyPropertyChanged,即重新阅读第三段。这意味着在某些代码执行后,要么通过在其他方法中直接调用NotifyPropertyChanged(“CanContinue”)来触发事件,要么重置CanContinue的值以强制再次引发事件。 - Metro Smurf
如果您注意我的代码,我在属性的setter上执行NotifyPropertyChanged("CanContinue");,因此每当值更改时,它都会被调用。这是我唯一需要它被调用的时间。每当我的对象完成验证时,CanContinue就会更改,当加载第二个表单时,它被设置为false,但按钮仍然保持启用状态。 - Chrisjan Lodewyks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接