UserControl enum DependencyProperty not binding



我创建了一个包含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。绑定确实执行了。

让我展示ComboBoxEnum绑定的UserControl(从现在开始)的另一个解决方案。这也是一个常见的问题,当您可以绑定枚举时,但是您无法从UC获得ComboBoxSelectedItem。此解决方案还将提供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"

若要在GridPanel中使用ExampleUC,请使用以下命令:

<views:ExampleUC EnumTypeArray="{Binding Source={StaticResource MyEnumName}}" SelectedItem="{Binding MyProperty, Mode=TwoWay}"/>

要将Mode设置为TwoWay,则必须能够设置getset的属性。请注意,如果Visual Studio不为您这样做,您可能必须在名称空间部分定义views名称空间。

可以看到,前面定义的DependencyProperties显示为属性。EnumTypeArray负责填充ComboBox的项目,而SelectedItem已经绑定到MyProperty,这是模型类中的一个属性,例如:

public ExampleEnum MyProperty{
    get{ return _myProperty;}
    set{
        _myProperty = value;
        OnPropertyChanged("MyProperty");
    }
}

这个例子只展示了如何通过uc使用枚举。由于此UC只有一个组件(ComboBox),因此在实践中毫无用处。如果你用Label或其他装饰它,它就会完成这项工作。

希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新