我已将依赖项属性MyList添加到wpf文本框中。依赖项属性的类型为List< string>。为了使xaml更容易,我已经定义了一个转换器,以便我可以使用以下语法:
<Grid>
<controls:MyTextBox x:Name="Hello" MyList="One,Two" Text="Hello" />
</Grid>
在Visual Studio中我根本无法编辑属性,在Expression Blend中我可以输入字符串,但它会生成以下xaml:
<controls:MyTextBox x:Name="Hello" Text="Hello" >
<controls:MyTextBox.MyList>
<System_Collections_Generic:List`1 Capacity="2">
<System:String>One</System:String>
<System:String>Two</System:String>
</System_Collections_Generic:List`1>
</controls:MyTextBox.MyList>
</controls:MyTextBox>
我是如何在Visual Studio和Blend中将此属性编辑为字符串的?
public class MyTextBox : TextBox
{
[TypeConverter(typeof(MyConverter))]
public List<string> MyList
{
get { return (List<string>)GetValue(MyListProperty); }
set { SetValue(MyListProperty, value); }
}
public static readonly DependencyProperty MyListProperty = DependencyProperty.Register("MyList", typeof(List<string>), typeof(MyTextBox), new FrameworkPropertyMetadata(new List<string> { "one" }));
}
public class MyConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if(sourceType == typeof(string))
return true;
return base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if(value is string)
return new List<string>(((string)value).Split(','));
return base.ConvertFrom(context, culture, value);
}
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if(destinationType == typeof(string))
return true;
return base.CanConvertTo(context, destinationType);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if(destinationType == typeof(string))
{
var ret = string.Empty;
var s = ret;
((List<string>)value).ForEach(v => s += s + v + ",");
ret = ret.Substring(0, ret.Length - 1);
return ret;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
答案 0 :(得分:0)
使用泛型不可能这样做,VS和Blend设计人员在进行设计时序列化时都会使用这些标签生成集合信息。一种解决方法是为MyList而不是List创建自己的数据类型。 :(
或者
您需要将MyList保留为String属性,然后解析后续字符串并将它们存储到List中。
或者
另一种可能的解决方案。 [如果您知道前面列表的值]
而不是使用List<string>
使其成为带有Flags的枚举。因此,您可以在没有这些垃圾代码的情况下在VS Designer和Blend中获得预期的输出语法。
HTH