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
,而后一种方法则不会。如果这是真的,你可能想在上面的答案中添加一条评论,让未来的读者明白这一点,以便他们能够更好地理解这两个选项之间的权衡。