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
こんにちはデビット、あなたの素早い答えをありがとう...私はあなたがSelectedValuePathについて指摘したことは、私が探しているものだと思います...しかし、この場合、どうすればバインディングを変更できますか? TextTemplate内のテキストブロック?再度、感謝します! – jpmir
@jpmir私の頭の上から私はそれをする方法を知らないし、把握するためにいくつかの微妙な変更が必要になります。 Silverlight 5を使用している場合、データテンプレートでカスタムマークアップ拡張を使用してバインディングを再定義することができます(例:http://www.codeproject.com/Articles/286171/MultiBinding-in-Silverlight-5)いくつかのことを試してみるのに数分しかなかったし、私はロードブロッキングにぶつかりましたが、あなたが連絡を取りたいと思ったら、私がどこで中断したかを教えてください。 – David
私は現在、SL 4を使用していますが、私の進捗状況を追加するために質問を編集しました。あなたが指摘したように、依存関係プロパティを使用して作業しています。特定のモデルプロパティ名を記述しないでdatatemplateをバインドするのは不可能なので、ValueConvertersを使用しましたが、データがロードされる順序を処理するための回避策を講じなければなりませんでした。どうもありがとうございました! – jpmir