2010-11-10 129 views
3

我試圖爲Windows Phone 7平臺構建一個自定義控件。到目前爲止,我已經定義了屬性,如果它是一個簡單類型(如字符串),它的工作正常,但最終需要是一個數組。所以我定義我的財產是這樣的:綁定到陣列支持的屬性

#region Keywords 

    public string[] Keywords 
    { 
     get { return (string[])GetValue(KeywordsProperty); } 
     set { SetValue(KeywordsProperty, value); } 
    } 

    public static readonly DependencyProperty KeywordsProperty = 
     DependencyProperty.Register(
      "Keywords", 
      typeof(string[]), 
      typeof(MyType), 
      new PropertyMetadata(null)); 

    #endregion Keywords 

現在我要頂支持綁定和XAML,但我無法弄清楚如何通過XAML設置屬性。有一個更好的方法嗎?

回答

5

使用字符串[]在XAML

您可以在XAML實例化你的關鍵詞屬性,如下所示:

<MyControl ...> 
    <MyControl.Keywords> 
    <sys:String>Happy</sys:String> 
    <sys:String>Sad</sys:String> 
    <sys:String>Angry</sys:String> 
    </MyControl.Keywords> 
</MyControl> 

注:這是假定空間聲明

xmlns:sys="clr-namespace:System;assembly=mscorlib" 

你可以將ItemsControl綁定到您的關鍵字,如下所示:

<ListBox ItemsSource="{Binding Keywords}" ...> 

在此示例中,每個關鍵字將顯示爲單獨的ListBox項目。

只要數組成員保證永不改變(可以用新數組替換數組,但不能更改其元素),在WPF中爲此目的使用一個字符串[]是完全可以理解的。這是因爲數組沒有更改通知機制。

如果你的元素可能會改變

如果你的關鍵詞數組中的元素可能會改變,你應該使用一個ObservableCollection,而不是一個數組。使其成爲只讀CLR屬性(不是依賴項屬性)並在構造函數中初始化它。然後,您可以完全按照上圖所示將其填充到XAML中,但對集合的任何更改都會立即反映在您的UI中。

我實際上使用我自己的集合類,它比ObservableCollection有更多的功能。只要它實現INotifyCollectionChanged,不管你使用什麼集合類。

製作用純XAML

使用綁定,無法更新您的關鍵字數組列表更新。如果您需要更新關鍵字並希望完全使用XAML和綁定來完成此操作,則需要創建一個包含該字符串的Keyword對象類,然後將它們放入ObservableCollection或類似對象中。

的IValueConverter

另一種方法是使用的IValueConverter以逗號分隔的字符串列表轉換和從字符串[],就像這樣:

<TextBox Text="{Binding Keywords, 
         Converter={x:Static my:CommaSeparatedConverter.Instance}}" /> 

,其中轉換器將:

public class CommaSeparatedConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    return string.Join(",", (string[])value); 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
    return ((string)value).Split(','); 
    } 
} 
+0

我x上得到一個錯誤:數組(類型「X:陣」未找到)。在文檔xmlns之前:x被定義爲「http://schemas.microsoft.com/winfx/2006/xaml」,而x:在頁面中的其他地方像正常一樣工作。 – Hounshell 2010-11-10 22:02:59

+0

另外,是否有更多的WPF-ISH方式來做到這一點?就像一個可觀察的集合或其他東西。我不會更新列表,只是偶爾檢查它。 – Hounshell 2010-11-10 22:09:28

+0

由於關鍵字被聲明爲字符串[],因此實際上並不需要XAML中的x:Array語法。我從我的答案中刪除了它。 (我很困惑,爲什麼它不爲你工作:我用x:數組經常和它聽起來像你做正確),我還添加了有關何時以及更多信息,爲什麼你可能會改用的ObservableCollection x的:數組。 – 2010-11-11 00:06:53

0

你應該能夠以這種方式綁定到一個特定的數組元素:

<Textblock Text="{Binding Keywords[0]}" /> 

假設當然在當前DataContext中可以使用關鍵字。

+0

我試圖字符串整個陣列綁定到單個屬性其本身是一個字符串[],而不是一個陣列 – Hounshell 2010-11-10 22:08:49

+0

疑難雜症的元件。對困惑感到抱歉。 – 2010-11-10 22:39:57