WPF - 更新依赖属性后未触发绑定

3
我有以下的DependencyProperty
public bool IterationSelected
{
    get { return (bool)GetValue(IterationSelectedProperty); }
    set { SetValue(IterationSelectedProperty, value); }
}
public static readonly DependencyProperty IterationSelectedProperty =
  DependencyProperty.Register("IterationSelected", typeof(bool),
  typeof(MainMediator), new UIPropertyMetadata(false));

以下是使用VS模板生成的内容:

然后我有一个DataTrigger来更新它:

<Grid.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource IsOpenFalseAndIsCheckedTrueMultiConverter}">
                        <Binding ElementName="popSelectIteration" Path="IsOpen"/>
                        <Binding ElementName="chkIteration" Path="IsChecked"/>
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="loc:MainMediator.IterationSelected" Value="True"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Grid.Style>

最后,我有一个Grid,其可见性取决于属性。
<Grid Visibility="{Binding IterationSelected, Converter={StaticResource BooleanToVisibilityConverter}, diagnostics:PresentationTraceSources.TraceLevel=High}" Grid.Row="1">
    <TextBlock>Testing 1323</TextBlock>
</Grid>

所以,这里的问题是,我已经使用了diagnostics:PresentationTraceSources.TraceLevel="High"来测试所有的绑定,除了当loc:MainMediator:IterationSelected被设置为true时,Grid没有捕捉到它。什么都没有触发。不是不能绑定或其他什么问题,它甚至都没有尝试。唯一的时间是应用程序启动时Grid绑定才会触发。那时它会正确地触发和评估。
我唯一尝试过的事情(失败了)是将IterationSelected变成一个附加属性,而不是一个普通的依赖属性。然而,那也失败了。
WPF大师们,有什么想法吗?
2个回答

2
有点难以确定,但看起来你的绑定源是错误的。此外,属性引用似乎存在一些歧义,但这可能是附加属性实验的副作用。
基本上,你的Grid.Visibility绑定正在寻找当前DataContext上的IterationSelected属性。但是你的Style DataTrigger正在设置loc:MainMediator.IterationSelected属性在Grid上。
解决方法是使你的Grid.Visibility绑定在Grid本身上查找loc:MainMediator.IterationSelected属性(而不是在DataContext上)。为此,请在绑定声明中添加RelativeSource={RelativeSource Self}:
Visibility="{Binding IterationSelected,
                     Converter={StaticResource BooleanToVisibilityConverter},
                     RelativeSource={RelativeSource Self}}">

这个指令告诉绑定器查看被绑定元素,而不是DataContext

你可能还需要将路径更改为loc:MainMediator.IterationSelected,而不仅仅是IterationSelected

最后,根据IterationSelected属性是否执行其他任务,另一种方法是直接设置可见性,而不是使用Setter:

<DataTrigger Value="True">
  <!-- binding omitted -->
  <Setter Property="Visibility" Value="Visible" />
</DataTrigger>

1
您的示例中的Setter试图在Grid上设置IterationSelected属性,但DP由MainMediator类型拥有。您是否打算在MainMediator上设置值,如果是的话,它与Grid的关系如何?从这段代码中看来,您实际上可能想要将此样式应用于MainMediator控件,但我无法确定。您还提到尝试了AP,这将允许您在Grid上设置IterationSelected。
您能否提供更多关于您想要发生什么的上下文信息?

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