2012-02-16 7 views
0

ComboBox、ListBox、およびそのような種類の "セレクタ"コントロールは、 "path"という接尾辞を持ついくつかのプロパティを使用します。テンプレート自体を変更することなく、データ型を作成できます。ユーザーコントロール内のカスタム "パス"プロパティの実装

確かに私は、まさにこの技術の名前を知らないが、基本的に、私が取得しようとしているが、このようなものです:

<my:ACustomControl HeadingPath="SomePropertyOfModelA" ContentPath="OtherPropertyFromModelA" ItemsSource="{Binding ModelA}"... /> 

...とコントロールには何も変更せずにかそのデータテンプレート、私は本当に、文字列の連結を使用して動的にするDataTemplateを構築するアプローチを好まないこの

<my:ACustomControl HeadingPath="DifferentPropertyFromModelB" ContentPath="NewPropertyFromB" ItemsSource="{Binding ModelB}" ... /> 

を行うことができること...

任意のIDEとして?

EDIT:

OK、

それは今働いているが、私のアプローチにいくつかの暗点があります。私はValueConvertersを使用してプロパティの実際の値を取得しています。この値コンバータはXamlで静的リソースとしてインスタンス化されていますので、ItemsControlはItemConverttersの前にItemsデータを受け取ってからusercontrolが表示されているときに優先順位があります。プロパティの名前を取得します。結果として何も変換されません。

私の回避策は、HeadingPathの値を設定した直後に、ValueConverterのPathProperty Valueをコードから強制的に設定することでした。そのため、静的リソースにはx:Nameとx:Keyがあります。

ここまでは私がこれまで行ってきたことです。

<ItemsControl x:Name="InternalItemsControl" ItemsSource="{Binding Items, Mode=TwoWay}"> 

アイテム:

1.-内でこのようなItemsControlにしてカスタムコントロールを作成します(私は上の命名規則の世話をしないために申し訳ないと、サンドボックスとしてこれを考慮してください)

2.-セットの分離コードの背後にあるコードで依存関係プロパティは、クラスのコンストラクタでユーザーコントロールLayoutRootグリッドのDataContextのよう

Public Sub New() 
    InitializeComponent() 
    LayoutRoot.DataContext = Me 
End Sub 

ある3.- dependenの定義しますCYプロパティは

の背後にあるコードでアイテムの名前4.-ビジネスオブジェクトのプロパティ名に

を保持するために、文字列型のHeadingPathという名前の依存関係プロパティを定義5.-もDependencyObjectから継承し、実装は次のようにINotifyPropertyChangedのIVaueConverterの実装を作成します。

Imports System.Windows.Data 
Imports System.ComponentModel 

Public Class PathPropertiesValueConverter 
    Inherits DependencyObject 
    Implements IValueConverter 
    Implements INotifyPropertyChanged 
    ... 

6.-データを変換する際に値が戻り値として使用されるプロパティの名前を保持する文字列型のPathProperty名前IValueConverter実装内部依存性を定義します。

Public Function Convert(value As Object, targetType As System.Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert 
     If value IsNot Nothing AndAlso Not String.IsNullOrEmpty(PathProperty) Then 
      Return value.GetType.GetProperty(PathProperty).GetValue(value, Nothing) 
     Else 
      Return Nothing 
     End If 
    End Function 

8:変換方法...で

7.-。

<StackPanel Orientation="Vertical" > 
     <local:MyCustomControl HeadingPath="PropiedadA" Items="{Binding Listado, Mode=TwoWay}" /> 
     <local:MyCustomControl HeadingPath="PropiedadB" Items="{Binding Listado2, Mode=TwoWay}" /> 
    </StackPanel> 

10: - あなたはどのSilverlightページからのItemsControlにChildItemsをバインドするHeadingPathプロパティに文字列としてプロパティ名を使用することができます。この後、ユーザーコントロール

<local:PathPropertiesValueConverter x:Key="PathConverter" x:Name="HeadingPathConverter" 
    PathProperty="{Binding ElementName=LayoutRoot, Path=DataContext.HeadingPath, Mode=TwoWay}" /> 

9.-に静的リソースとしてIValueConverter実装をインスタンス化.-ビーイングListadoとListadoデータと、このレベルのセットで、すべての結合のものを搭載した2 ObservableCollections、...これが結果です:

http://dl.dropbox.com/u/6450273/PathProperties.JPG

答えて

0

あなたのベスト・オプションは、DataTemplateを自分で作成することです。背後では、DisplayMemberPathは基本的にプロパティにバインドされたTextBlockを持つDataTemplateを作成しています。 SelectedValuePathは、選択した値バインディングパスを設定するPropertyChangedCallbackを持つDependencyPropertyです。最終的に作成するカスタムプロパティは、他の場所で定義した機能のショートカットにすぎません。

+0

こんにちはデビット、あなたの素早い答えをありがとう...私はあなたがSelectedValuePathについて指摘したことは、私が探しているものだと思います...しかし、この場合、どうすればバインディングを変更できますか? TextTemplate内のテキストブロック?再度、感謝します! – jpmir

+0

@jpmir私の頭の上から私はそれをする方法を知らないし、把握するためにいくつかの微妙な変更が必要になります。 Silverlight 5を使用している場合、データテンプレートでカスタムマークアップ拡張を使用してバインディングを再定義することができます(例:http://www.codeproject.com/Articles/286171/MultiBinding-in-Silverlight-5)いくつかのことを試してみるのに数分しかなかったし、私はロードブロッキングにぶつかりましたが、あなたが連絡を取りたいと思ったら、私がどこで中断したかを教えてください。 – David

+0

私は現在、SL 4を使用していますが、私の進捗状況を追加するために質問を編集しました。あなたが指摘したように、依存関係プロパティを使用して作業しています。特定のモデルプロパティ名を記述しないでdatatemplateをバインドするのは不可能なので、ValueConvertersを使用しましたが、データがロードされる順序を処理するための回避策を講じなければなりませんでした。どうもありがとうございました! – jpmir

関連する問題