C# 如何正确公开自定义控件上的属性?
我正在尝试在C# 如何正确公开自定义控件上的属性?,c#,wpf,xaml,xamarin,xamarin.forms,C#,Wpf,Xaml,Xamarin,Xamarin.forms,我正在尝试在Xamarin.Forms中创建一个自定义控件,并正确地公开属性。我相信同样的原则也适用于WPF 我的控制 public class ExtendedMap : Map { public ExtendedMap() { } private IList<Pin> _staticPins; public IList<Pin> StaticPins { get { return _staticPin
Xamarin.Forms
中创建一个自定义控件,并正确地公开属性。我相信同样的原则也适用于WPF
我的控制
public class ExtendedMap : Map
{
public ExtendedMap()
{
}
private IList<Pin> _staticPins;
public IList<Pin> StaticPins
{
get { return _staticPins; }
set { _staticPins = value;}
}
}
公共类扩展映射:映射
{
公共扩展映射()
{
}
私人IList_;
公共IList静态引脚
{
获取{return\u staticPins;}
设置{u staticPins=value;}
}
}
在Xaml中,我目前正在这样使用它:
<custom:ExtendedMap x:Name="map" Grid.Row="2" HorizontalOptions="Fill" VerticalOptions="Fill" IsVisible="{Binding CustomerSearchControlViewModel.MapIsDisplayed}">
<custom:ExtendedMap.StaticPins>
<x:Array Type="{x:Type maps:Pin}">
<maps:Pin Label="Hello" Address="{Binding CustomerSearchControlViewModel.SelectedCustomer.Address, Converter={StaticResource AddressToStringConverter}" Position="{Binding CustomerSearchControlViewModel.SelectedCustomer.Position}" Type="Place"/>
</x:Array>
</custom:ExtendedMap.StaticPins>
</custom:ExtendedMap>
如果我取出
零件,我会得到一个错误:
序列不是IEnumerable
但我想这样使用它:
<custom:ExtendedMap.StaticPins>
<maps:Pin Label="Hello" Address="{Binding CustomerSearchControlViewModel.SelectedCustomer.Address, Converter={StaticResource AddressToStringConverter}" Position="{Binding CustomerSearchControlViewModel.SelectedCustomer.Position}" Type="Place"/>
</custom:ExtendedMap.StaticPins>
这可能吗?正确的方法是什么?来自
3) 如果XAML要将属性识别为集合属性,则属性的类型必须实现IList
,而不是IList
不幸的是,更一般地说,XAML和泛型类型不能很好地协同工作
如果这不能解决您的问题,请改进您的问题。提供可靠的重现问题的方法,以便更清楚场景是什么
您可能还对它感兴趣,它显示了如何在XAML中将属性声明为子元素的默认集合。多亏了@Peter Duniho的回答,这迫使我朝着正确的方向前进。这是他提到的几点的结合 首先,我必须在
ExtendedMap
上实现IList
,这样我就可以在Xaml
中设置项目列表,而无需使用数组
最终的解决方案是这样的:
public class ExtendedMap : Map : IList
{
public ExtendedMap()
{
}
private IList<Pin> _staticPins = new List<Pin>();
public IList<Pin> StaticPins
{
get { return _staticPins; }
set { _staticPins = value;}
}
//..IList Implementations
Public int Add(object item)
{
var pin = (Pin)item;
StaticPins.Add(pin);
return 1;
}
}
public类ExtendedMap:Map:IList
{
公共扩展映射()
{
}
私有IList_staticPins=新列表();
公共IList静态引脚
{
获取{return\u staticPins;}
设置{u staticPins=value;}
}
//…IList实现
公共整数添加(对象项)
{
var pin=(pin)项;
StaticPins.Add(pin);
返回1;
}
}
查看一下IList界面@MethodMan谢谢,但我不确定我应该在哪里查看?你是什么意思。。我刚刚给了你链接。。听起来你有一个IEnumerable
问题..@MethodMan我的意思是我可以看到可枚举API文档,但我不明白它是如何链接/解决我的问题的?对不起,如果我遗漏了什么好的,看看这个解决方案,那么你的第一点是正确的。我必须实现IList
而不是IList
。我将稍后发布我的实际解决方案。我假设您选择在类本身中实现IList
,而不是将[ContentProperty(“StaticPins”)]
添加到声明中,因为前一种方法允许您在属性类型上保留泛型IList
,而后一种方法则不会。如果这是真的,你可能想在上面的答案中添加一条评论,让未来的读者明白这一点,以便他们能够更好地理解这两个选项之间的权衡。