1

バインディングに関する次のトレース情報を取得します。

    System.Windows.Data Warning: 55 : Created BindingExpression (hash=45919010) for Binding (hash=4523055)
    System.Windows.Data Warning: 57 :   Path: 'IsEnvelopeFocused'
    System.Windows.Data Warning: 59 : BindingExpression (hash=45919010): Default mode resolved to TwoWay
    System.Windows.Data Warning: 60 : BindingExpression (hash=45919010): Default update trigger resolved to PropertyChanged
    System.Windows.Data Warning: 61 : BindingExpression (hash=45919010): Attach to System.Windows.Controls.DataGridCell.IsFocused (hash=42777048)
    System.Windows.Data Warning: 66 : BindingExpression (hash=45919010): Resolving source 
    System.Windows.Data Warning: 69 : BindingExpression (hash=45919010): Found data context element: DataGridCell (hash=42777048) (OK)
    System.Windows.Data Warning: 77 : BindingExpression (hash=45919010): Activate with root item VulnerEnvelope (hash=53089570)

    System.Windows.Data Warning: 106 : BindingExpression (hash=45919010):   At level 0 using cached 
accessor for VulnerEnvelope.IsEnvelopeFocused: RuntimePropertyInfo(IsEnvelopeFocused)

    System.Windows.Data Warning: 103 : BindingExpression (hash=45919010): Replace item at level 0 with VulnerEnvelope (hash=53089570), using accessor RuntimePropertyInfo(IsEnvelopeFocused)
    System.Windows.Data Warning: 100 : BindingExpression (hash=45919010): GetValue at level 0 from VulnerEnvelope (hash=53089570) using RuntimePropertyInfo(IsEnvelopeFocused): 'False'
    System.Windows.Data Warning: 79 : BindingExpression (hash=45919010): TransferValue - got raw value 'False'

また、コンバーターを使用してデータ フローを出力しTarget -> SourceますSource -> Target
これに加えて、添付プロパティが変更されるたびにバインディング情報を出力します。
バインディングはアクティブのままですが、ソースとターゲットは同期しません。この壊れた機能の原因がわかりません。VS2012 が警告 106 を赤で出力するので、問題はこのメッセージの近くにあると思います。

そして、ここにバインディングがあります:

<DataGridTemplateColumn Width="*" CanUserResize="True" CanUserSort="True" Header=" Title "
                                                SortMemberPath=".">
  <DataGridTemplateColumn.CellStyle>
    <Style TargetType="DataGridCell">
      <Setter Property="Helpers:FocusHelper.IsFocused" Value="{Binding IsEnvelopeFocused, Converter={StaticResource bdc}, PresentationTraceSources.TraceLevel=High}"/>
    </Style>
  </DataGridTemplateColumn.CellStyle>
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <TextBlock Name="txtTitle" VerticalAlignment="Center">
        <TextBlock.Text>
          <MultiBinding Converter="{StaticResource TitleConverter}" UpdateSourceTrigger="PropertyChanged">
            <Binding Path="." />
            <Binding Path="DataContext.Language" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=UserControl}" />
          </MultiBinding>
        </TextBlock.Text>
      </TextBlock>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
4

1 に答える 1

1

理由はわかりませんが、このストリートマジックが役に立ちました!

そうだった:

<Setter Property="Helpers:FocusHelper.IsFocused" Value="{Binding IsEnvelopeFocused,
                                Converter={StaticResource bdc}, 
                                PresentationTraceSources.TraceLevel=High}"/>

次のようになりました。

<Setter Property="Helpers:FocusHelper.IsFocused" Value="{Binding DataContext.IsEnvelopeFocused, 
                                Converter={StaticResource bdc}, 
                                PresentationTraceSources.TraceLevel=High, 
                                RelativeSource={RelativeSource Self}}"/>

データ バインディング トレース出力が変更されました:

System.Windows.Data Warning: 55 : Created BindingExpression (hash=52742621) for Binding (hash=33023833)
System.Windows.Data Warning: 57 :   Path: 'DataContext.IsEnvelopeFocused'
System.Windows.Data Warning: 59 : BindingExpression (hash=52742621): Default mode resolved to TwoWay
System.Windows.Data Warning: 60 : BindingExpression (hash=52742621): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 61 : BindingExpression (hash=52742621): Attach to System.Windows.Controls.DataGridCell.IsFocused (hash=34022436)
System.Windows.Data Warning: 66 : BindingExpression (hash=52742621): Resolving source 
System.Windows.Data Warning: 69 : BindingExpression (hash=52742621): Found data context element: <null> (OK)
System.Windows.Data Warning: 71 :   RelativeSource.Self found DataGridCell (hash=34022436)
System.Windows.Data Warning: 77 : BindingExpression (hash=52742621): Activate with root item DataGridCell (hash=34022436)
System.Windows.Data Warning: 106 : BindingExpression (hash=52742621):   At level 0 using cached accessor for DataGridCell.DataContext: DependencyProperty(DataContext)

System.Windows.Data Warning: 103 : BindingExpression (hash=52742621): Replace item at level 0 with DataGridCell (hash=34022436), using accessor DependencyProperty(DataContext)
System.Windows.Data Warning: 100 : BindingExpression (hash=52742621): GetValue at level 0 from DataGridCell (hash=34022436) using DependencyProperty(DataContext): VulnerEnvelope (hash=14963839)

System.Windows.Data Warning: 106 : BindingExpression (hash=52742621):   At level 1 using cached accessor for VulnerEnvelope.IsEnvelopeFocused: RuntimePropertyInfo(IsEnvelopeFocused)

System.Windows.Data Warning: 103 : BindingExpression (hash=52742621): Replace item at level 1 with VulnerEnvelope (hash=14963839), using accessor RuntimePropertyInfo(IsEnvelopeFocused)
System.Windows.Data Warning: 100 : BindingExpression (hash=52742621): GetValue at level 1 from VulnerEnvelope (hash=14963839) using RuntimePropertyInfo(IsEnvelopeFocused): 'False'
System.Windows.Data Warning: 79 : BindingExpression (hash=52742621): TransferValue - got raw value 'False'
System.Windows.Data Warning: 81 : BindingExpression (hash=52742621): TransferValue - user's converter produced 'False'
System.Windows.Data Warning: 88 : BindingExpression (hash=52742621): TransferValue - using final value 'False'

また、バインドは両方の方法で機能するようになりました。
DataGridCell の DataContext の継承とスタイルの適用に問題があると思います。
正確に言うと、ここでは順序が重要だと思います。
Style が最初に適用された場合、Data Binding はまだ継承されていない DataContext を取得しようとし、何らかの理由でバインディングが壊れて更新されません。
このバグを再現してみます。再現できたら、MS Connect に書き込みます。

于 2013-01-25T13:06:18.977 に答える