我正在尝试为 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
现在我想要顶级支持绑定(bind)和 XAML,但我不知道如何通过 XAML 设置属性。有一个更好的方法吗?
最佳答案
在 XAML 中使用 string[]
您可以在 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 绑定(bind)到您的关键字,如下所示:
<ListBox ItemsSource="{Binding Keywords}" ...>
在此示例中,每个关键字将显示为单独的 ListBox 项。
在 WPF 中为此目的使用 string[] 是完全符合 kosher 的,只要保证数组成员永远不会更改(您可以用新数组替换数组,但不能更改其元素)。这是因为数组没有更改通知机制。
如果你的元素可能会改变
如果关键字数组的元素可能会更改,则应使用 ObservableCollection 而不是数组。使其成为只读 CLR 属性(不是依赖属性)并在您的构造函数中对其进行初始化。然后您可以完全如上所示在 XAML 中填充它,但对集合的任何更改都将立即反射(reflect)在您的 UI 中。
我实际上为此使用了我自己的集合类,它比 ObservableCollection 具有更多的功能。只要它实现了 INotifyCollectionChanged,你使用什么集合类并不重要。
使用纯 XAML 使列表可更新
您不能使用绑定(bind)更新关键字数组。如果您需要更新关键字并希望完全使用 XAML 和绑定(bind)来完成,您需要创建一个包含字符串的关键字对象类,然后将它们放入 ObservableCollection 或类似的中。
IValueConverter
另一种方法是使用 IValueConverter 将逗号分隔的字符串列表与 string[] 相互转换,如下所示:
<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(',');
}
}
关于c# - 绑定(bind)到数组支持的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4148312/