Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建具有可接受任何类型的依赖项属性的silverlight 4 usercontrol_Silverlight_Generics_Types_Dependencies_Properties - Fatal编程技术网

如何创建具有可接受任何类型的依赖项属性的silverlight 4 usercontrol

如何创建具有可接受任何类型的依赖项属性的silverlight 4 usercontrol,silverlight,generics,types,dependencies,properties,Silverlight,Generics,Types,Dependencies,Properties,我正在寻找一种在silverlight 4中创建UserControl并公开依赖项属性的方法,该属性可以接受任何类型。我的意思是,例如,如果您查看标准silverlight控件(如AutoCompleteBox),它能够处理任何类型的集合。因此,您可以将AutoCompleteBox与IEnumerable或IEnumerable等绑定。当选择任何项目时,AutoCompleteBox会通过SelectedItem dependency属性返回所选的值,即人类实例或动物实例 我希望通过userc

我正在寻找一种在silverlight 4中创建UserControl并公开依赖项属性的方法,该属性可以接受任何类型。我的意思是,例如,如果您查看标准silverlight控件(如AutoCompleteBox),它能够处理任何类型的集合。因此,您可以将AutoCompleteBox与IEnumerable或IEnumerable等绑定。当选择任何项目时,AutoCompleteBox会通过SelectedItem dependency属性返回所选的值,即人类实例或动物实例

我希望通过usercontrol实现类似的灵活性。我想公开2个依赖属性SuggestedItems并选择EdItem。通过此usercontrol的使用者通过绑定将哪个集合设置为SuggestedItems,以IEnumerable为例,我希望SelectedItem属性通过绑定将Car类型的实例发送回使用者。如果我使用了IEnumerable,那么我需要返回带有SelectedItem的Boat

我试图通过使用以下使用MVVM的示例来实现它,但它不起作用。我正在寻找一些关于如何设计它的线索,我是否走上了正确的道路,或者我必须完全改变我的设计

我创建了一个名为VehicleSelectorUserControl的用户控件,它有自己的专用视图模型,名为VehicleSelectorViewModel,带有两个项目建议EdItems,SelectedItem

并且usercontrol在其codebehind中具有相应的依赖属性,以便向usercontrol的使用者公开这些属性。UserControl XAML有一个列表框,该列表框绑定到VehicleSelectorViewModel的SuggestideItems属性。当用户进行选择时,将设置VehicleSelectorViewModel SelectedItem,用户将调用名为ItemSelected的委托通知VehicleSelectorUserControl codebehind,然后该委托将设置SelectedItem依赖项属性以使其可供消费者使用

下面是来自VehicleSelectorUserControl.xaml.cs代码隐藏的代码

private VehicleSelectorViewModel _TheViewModel;
    public UserNameControl()
    {
        InitializeComponent();
        _TheViewModel = Resources["TheViewModel"] as VehicleSelectorViewModel;
        _TheViewModel.ItemSelected = OnItemSelected;
    }

    public IEnumerable<object> SuggestedItems
    {
        get { return (IEnumerable<object>)GetValue(SuggestedItemsProperty); }
        set { SetValue(SuggestedItemsProperty, value); }
    }
    public static readonly DependencyProperty SuggestedItemsProperty =
        DependencyProperty.Register("SuggestedItems", typeof(IEnumerable<object>), typeof(VehicleSelectorControl), new PropertyMetadata(OnSuggestedItemsSet));

    private static void OnSuggestedItemsSet(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        _TheViewModel.SuggestedItems = e.NewValue;
    }

    public object SelectedItem
    {
        get { return (String) GetValue(SelectedItemProperty); }
        set { SetValue(SelectedItemProperty, value); }
    }
    public static readonly DependencyProperty SelectedItemProperty =
        DependencyProperty.Register("SelectedItem", typeof(object), typeof(VehicleSelectorControl), null);

    private void OnItemSelected()
    {
        SelectedItem = _TheViewModel.SelectedItem;
    }
消费者的XAML看起来像消费者有自己的ViewModel,负责提供SuggestedCars[IEnumerable],SuggestedBoats[IEnumerable]


我只使用IEnumerable类,不使用任何泛型参数。这里也不需要动态关键字。使用视图模型中的实类型和控件中的对象,xaml将完成转换值的其余工作。我试图用IEnumerable保留类型,并希望使UserControl更通用。我将尝试使用带有TemplateBinding的自定义控件,而不是usercontrol,看看它是否能帮助我实现我想要的。
public Action ItemSelected { get; set; }

    private dynamic _SelectedItem;

    public dynamic SelectedItem
    {
        get { return _SelectedItem; }
        set
        {
            if (value != _SelectedItem)
            {
                _SelectedItem = value;
                NotifyPropertyChanged("SelectedItem");
                if(ItemSelected != null) ItemSelected.Invoke();
            }
        }
    }


    private dynamic _SuggestedItems;

    public dynamic SuggestedItems
    {
        get { return _SuggestedItems; }
        set
        {
            if (value != _SuggestedItems)
            {
                _SuggestedItems = value;
                NotifyPropertyChanged("SuggestedItems");
            }
        }
    } 
            <my:VehicleSelectorControl x:Name="MyCarSelectorControl" 
                                   SuggestedItems="{Binding SuggestedCars, Mode=TwoWay}"  
                                   SelectedItem="{Binding UserSelectedCar, Mode=TwoWay}" />

        <my:VehicleSelectorControl x:Name="MyBoatSelectorControl" 
                                   SuggestedItems="{Binding SuggestedBoats, Mode=TwoWay}"  
                                   SelectedItem="{Binding UserSelectedBoat, Mode=TwoWay}" />