我创建了一个包含3个DependencyProperties的UserControl。两个都很好,但有一个让我很头疼。我有一个enum(在UserControl类之外,但相同的命名空间):
public enum RecordingType
{
NoRecording,
ContinuesRecording,
EventRecording
}
我为它创建了一个DependencyProperty如下:
public static DependencyProperty SelectedRecordingTypeProperty = DependencyProperty.Register("SelectedRecordingType", typeof(RecordingType), typeof(SchedulerControl),
new FrameworkPropertyMetadata((RecordingType)RecordingType.NoRecording, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public RecordingType SelectedRecordingType
{
get
{
return (RecordingType)GetValue(SelectedRecordingTypeProperty);
}
set
{
SetValue(SelectedRecordingTypeProperty, value);
}
}
我在XAML中这样使用
<userControls:SchedulerControl
Grid.Row="1"
Grid.Column="3"
SelectedRecordingType="{Binding CurrentRecordingType,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
FullRecordingSchedule="{Binding MondayFullRecordingSchedule,UpdateSourceTrigger=PropertyChanged}"
SelectedRecordingTime="{Binding MondaySelectedRecordingTime,UpdateSourceTrigger=PropertyChanged}"/>
还有两个DependencyProperties工作得很好(我在UserControl中得到了它们的get和set方法),但这个是不允许的。我之前也制作过DPs,我现在做的都是一样的。我还确保我的VM中的绑定是正确的,并且正确调用了getter和setter。
任何帮助将是伟大的!
我也检查了我的VM。绑定确实执行了。
让我展示ComboBox
和Enum
绑定的UserControl
(从现在开始)的另一个解决方案。这也是一个常见的问题,当您可以绑定枚举时,但是您无法从UC获得ComboBox
的SelectedItem
。此解决方案还将提供SelectedItem
.
例如,我有一个ExampleUC : UserControl
UC类,它能够接受enum,并提供SelectedItem
。它将使用属性(.xaml中的属性)来实现。我还有一个enum,叫做ExampleEnum
,和Window
,它创建了一个新的ExampleUC
实例,并设置了它的属性/属性。
在ExampleUC.xaml:
<UserControl x:Class="TestNamespace.View.ExampleUC"
xmlns:view="clr-namespace:TestNamespace.View"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:markup="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType={markup:Type view:ExampleUC}}}">
<ComboBox ItemsSource="{Binding EnumTypeArray}" SelectedItem="{Binding SelectedItem}"/>
</Grid>
</UserControl>
您可以看到,UC的DataContext
已经被设置为它的祖先的DataContext,这意味着它可以接收所需的参数(您可以找到更多关于DataContext继承和可视化树的解释,只需对它们进行一些研究)。
绑定的属性(EnumTypeArray和SelectedItem)是exampleuc . example .cs文件中的DependencyProperties:
public Array EnumTypeArray
{
get { return (Array)GetValue(EnumTypeArrayProperty); }
set { SetValue(EnumTypeArrayProperty, value); }
}
public object SelectedItem
{
get { return (object)GetValue(SelectedItemProperty); }
set { SetValue(SelectedItemProperty, value); }
}
public static readonly DependencyProperty EnumTypeArrayProperty =
DependencyProperty.Register("EnumTypeArray", typeof(Array), typeof(ExampleUC), new PropertyMetadata(new string[0]));
public static readonly DependencyProperty SelectedItemProperty =
DependencyProperty.Register("SelectedItem", typeof(object), typeof(ExampleUC), new PropertyMetadata(null));
创建新的DependencyProperty
,你可以使用propdp
代码片段。(写入后默认按TAB键)。当您创建和编辑ExampleUC的实例时,这些属性将在.xaml编辑器中显示为属性。
在这个阶段,您有一个UC,它可以接受enum,并返回SelectedItem
。
枚举位置:
public enum ExampleEnum
{
Example1,
Example2
}
Window
,它使用ExampleUC:
你必须添加一个新的资源到窗口的资源,这将是一个ObjectDataProvider
为了能够使用你的enum作为ItemsSource
:
<Window.Resources>
<ObjectDataProvider x:Key="MyEnumName" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:ExampleEnum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
请注意,local
名称空间前缀已经在前面的名称空间部分定义过,它是ExampleEnum
的名称空间,例如:
xmlns:local="clr-namespace:TestNamespace.Data"
若要在Grid
或Panel
中使用ExampleUC
,请使用以下命令:
<views:ExampleUC EnumTypeArray="{Binding Source={StaticResource MyEnumName}}" SelectedItem="{Binding MyProperty, Mode=TwoWay}"/>
要将Mode
设置为TwoWay
,则必须能够设置get
和set
的属性。请注意,如果Visual Studio不为您这样做,您可能必须在名称空间部分定义views
名称空间。
可以看到,前面定义的DependencyProperties显示为属性。EnumTypeArray
负责填充ComboBox的项目,而SelectedItem
已经绑定到MyProperty,这是模型类中的一个属性,例如:
public ExampleEnum MyProperty{
get{ return _myProperty;}
set{
_myProperty = value;
OnPropertyChanged("MyProperty");
}
}
这个例子只展示了如何通过uc使用枚举。由于此UC只有一个组件(ComboBox
),因此在实践中毫无用处。如果你用Label
或其他装饰它,它就会完成这项工作。
希望能有所帮助。