我有以下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大师,有什么想法吗?

最佳答案

这很难说,但看来您的绑定源是错误的。关于属性引用似乎也有一些歧义,但这可能是附加的属性实验的产物。

基本上,您的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直接设置Visibility:

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

关于c# - wpf-更新的依赖项属性不触发绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2115307/

10-11 15:16
查看更多