如何创建具有可接受任何类型的依赖项属性的silverlight 4 usercontrol
我正在寻找一种在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代码隐藏的代码如何创建具有可接受任何类型的依赖项属性的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
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}" />