11

XAML 経由で依存関係プロパティをカスタム WPF コントロールにバインドしようとしています。

依存関係プロパティを登録する方法は次のとおりです。

public static readonly DependencyProperty AltNamesProperty = 
    DependencyProperty.Register ("AltNames", typeof(string), typeof(DefectImages));

public string AltNames
{
    get { return (string) GetValue(AltNamesProperty); }
    set { SetValue(AltNamesProperty, value); }
}

そして、XAML でそれを呼び出す方法は次のとおりです。

<DataGrid.Columns>                
    <DataGridTemplateColumn IsReadOnly="True">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <StackPanel Name="StackPanel1" Grid.Column="0" Width="950">
                    <TextBlock FontSize="16" TextDecorations="None" Text="{BindingPath=StandardName}" Foreground="Black"  FontWeight="Bold" Padding="5,10,0,0"></TextBlock>
                    <TextBlock Text="{Binding Path=AltNames}"TextWrapping="WrapWithOverflow" Padding="5,0,0,10"></TextBlock>
                    <!-- this part should be magic!! -->
                    <controls:DefectImages AltNames="{Binding Path=AltNames}"></controls:DefectImages>
                </StackPanel>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

AltNamesバインドしようとしているプロパティが有効なプロパティであることはわかっています。テキストブロックに問題なく表示できるからです。Dependency プロパティを正しく登録していませんか?

AltNamesコード ビハインドで正しい値を割り当てるにはどうすればよいですか?

4

2 に答える 2

19

私を始めてくれた@Dankoに感謝します。プロパティが変更されたときに値を設定するコールバックを登録しました。
これが私が最終的に得たものです:

private static void OnDefectIdChanged(DependencyObject defectImageControl, DependencyPropertyChangedEventArgs eventArgs)
{
  var control = (DefectImages) defectImageControl;
  control.DefectID = (Guid)eventArgs.NewValue;
}

/// <summary>
/// Registers a dependency property, enables us to bind to it via XAML
/// </summary>
public static readonly DependencyProperty DefectIdProperty = DependencyProperty.Register(
    "DefectID",
    typeof (Guid),
    typeof (DefectImages),
    new FrameworkPropertyMetadata(
      // use an empty Guid as default value
      Guid.Empty,
      // tell the binding system that this property affects how the control gets rendered
      FrameworkPropertyMetadataOptions.AffectsRender, 
      // run this callback when the property changes
      OnDefectIdChanged 
      )
    );

/// <summary>
/// DefectId accessor for for each instance of this control
/// Gets and sets the underlying dependency property value
/// </summary>
public Guid DefectID
{
  get { return (Guid) GetValue(DefectIdProperty); }
  set { SetValue(DefectIdProperty, value); }
}
于 2012-06-01T23:03:22.333 に答える
2

プロパティがコントロールのレンダリング方法に影響する場合は、PropertyMetadata引数をに指定する必要があるかもしれません。DependencyProperty.Register例えば:

DependencyProperty.Register("AltNames", typeof(string), typeof(DefectImages), 
                              new FrameworkPropertyMetadata( null,
                              FrameworkPropertyMetadataOptions.AffectsRender ) );
于 2012-06-01T21:37:54.727 に答える