2012-02-16 38 views
0

正如您可能注意到,組合框,列表框和那種「選擇」控件的使用了一些性能加上後綴「路徑」允許不同屬性名稱的對象結合其datatemplate而不更改模板本身。實現自定義的「路徑」用戶控件內部性能

當然,我不知道這種技術的確切名稱,但基本上,我想要得到的是這樣的:

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

...並沒有控制任何更改或它的數據模板能夠做到這一點

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

我真的不喜歡建築動態的DataTemplate中使用字符串拼接的方法...

任何IDE如?

編輯:

OK,

它的工作了,但對我的做法有些暗斑。由於我使用ValueConverters來獲取屬性的實際值,並且此值轉換器在Xaml中作爲靜態資源實例化,所以我發現在從UserControl接收項目數據之前顯示usercontrol時存在一些優先級順序,因爲ItemsControl在ValueConverters獲取財產的名稱。結果沒有得到轉換。

我的解決方法是強制設置HeadingPath的價值之後,從代碼中設置ValueConverter的PathProperty背後的價值是正確的。這就是爲什麼靜態資源滿足x:名稱和X:關鍵。

這是我到目前爲止所做的。 (請認爲這是一個沙箱,我很抱歉沒有采取命名約定的護理等)

1 .-隨着一個ItemsControl內像這樣創建自定義控制:

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

項目在哪裏是在類的構造函數中的代碼依賴屬性後面

2:設置代碼隱藏的用戶控件的DataContext電網LayoutRoot的

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

3.-定義dependen CY屬性命名代碼項目的背後

4.-定義一個名爲HeadingPath字符串類型的依賴屬性持有業務對象屬性名

5.-創建IVaueConverter實施也繼承自DependencyObject並實現INotifyPropertyChanged這樣

Imports System.Windows.Data 
Imports System.ComponentModel 

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

6.-定義一個名爲PathProperty類型的字符串來保存該值將轉換數據時使用的返回值的屬性的名稱的IValueConverter實現內部的依賴項屬性。

7.-在轉換方法...:

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。 - 實例化的IValueConverter實現靜態資源在用戶控件

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

9.-在此之後,你可以使用屬性名作爲字符串HeadingPath屬性從任何Silverlight頁面上的ItemsControl綁定ChildItems:

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

10正在Listado和Listado 2 ObservableCollections中加載數據和所有綁定的東西在這個級別集...這是結果:

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

回答

0

我認爲你最好的選擇是自己創建DataTemplate。在幕後DisplayMemberPath基本上是創建一個綁定到屬性的TextBlock的DataTemplate。 SelectedValuePath只是一個具有PropertyChangedCallback的DependencyProperty,用於設置選定的值綁定路徑。最終,您創建的任何自定義屬性都將成爲您在別處定義的某些功能的快捷方式。

+0

嗨大衛,感謝您的快速回答......我想,你指出的有關SelectedValuePath是我正在尋找...但在這種情況下,我怎麼能改變綁定,讓我們說一個文本塊,在DataTemplate內?再次感謝! – jpmir 2012-02-16 18:40:37

+0

@jpmir關閉我的頭頂,我不知道該怎麼做,需要一些修補才能弄清楚。如果您使用的是Silverlight 5,則可以在數據模板中使用自定義標記擴展來重新定義綁定(例如http://www.codeproject.com/Articles/286171/MultiBinding-in-Silverlight-5)I只有幾分鐘的時間去嘗試一些事情,並且我遇到了障礙,但是如果你想聯繫我,我可以告訴你我離開的地方。 – David 2012-02-16 22:04:44

+0

我現在正在使用SL 4,正如你所看到的,我已經編輯了這個問題來添加我的進度......我通過使用你指出的依賴項屬性來工作。由於在沒有寫入特定模型屬性名稱的情況下綁定在datatemplate中是不可能的,所以我使用了ValueConverters,但是我必須採取一些解決方法來處理數據加載的順序......希望您可以檢查並給我您的想法。非常感謝你! – jpmir 2012-02-16 22:38:38