wpf - 更新的依赖项属性未触发绑定

时间:2010-01-22 05:44:13

标签: c# wpf xaml data-binding dependency-properties

我有以下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 个答案:

答案 0 :(得分:2)

这有点难以辨别,但看起来你的绑定来源是错误的。关于属性参考似乎也有些含糊不清,但这可能是所附属性实验的人工制品。

基本上,您的Grid.Visibility绑定正在当前IterationSelected上查找DataContext属性。但您的样式DataTrigger正在网格上设置loc:MainMediatorIterationSelected属性。

解决此问题的方法是让Grid.Visibility绑定在Grid本身(而不是loc:MainMediator)上查找IterationSelectedDataContext属性。为此,请将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 :(得分:1)

示例中的Setter正在尝试在网格上设置IterationSelected属性,但DP由MainMediator类型拥有。您是否打算在MainMediator上设置值,如果是,那么它与网格相关的位置是什么?看起来您可能实际上想要将此样式应用于MainMediator控件,但我无法从此代码中得知。您还提到了尝试AP,它允许您在网格上设置IterationSelected

你能否提供一些关于你打算发生什么的更多背景信息?