Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
C# 我的用户控件上的所有基本属性是否都需要依赖属性?_C#_Wpf_Mvvm_User Controls_Dependency Properties - Fatal编程技术网

C# 我的用户控件上的所有基本属性是否都需要依赖属性?

C# 我的用户控件上的所有基本属性是否都需要依赖属性?,c#,wpf,mvvm,user-controls,dependency-properties,C#,Wpf,Mvvm,User Controls,Dependency Properties,我目前正在编写我的第一个用户控件,它由堆栈面板中的标签和文本框组成,如下所示: <Grid> <StackPanel Orientation="Horizontal" DataContext="{Binding RelativeSource={RelativeSource Self}}"> <Label Content="{Binding Label}" Width="60"></Label> <Tex

我目前正在编写我的第一个用户控件,它由堆栈面板中的标签和文本框组成,如下所示:

<Grid>
    <StackPanel Orientation="Horizontal" DataContext="{Binding RelativeSource={RelativeSource Self}}">
        <Label Content="{Binding Label}" Width="60"></Label>
        <TextBox Text="{Binding TextBoxContent}" Width="60"/>
    </StackPanel>
</Grid>

这在设置页面中最有用,因为它将被重新用于几个不同的设置。对于这些设置中的每一个,我都希望设置(至少)宽度、高度、验证规则和错误模板属性。至于文本本身,我已经为标签和文本框创建了一个依赖属性(正如您在上面的代码片段中看到的)


我的问题是:当我实际使用我的用户控件时,我是否需要为我刚才提到的所有我想设置的属性创建一个依赖属性?这似乎是多余的工作(因为它们已经存在于文本框中,基本上它们只是将我的用户控件的属性重定向到相同名称的文本框属性)?如果我想在我的文本框上使用更多属性(例如,AcceptsReturn等),这将是更多的工作。

如果您决定从
文本框
派生,而不是从
用户控件
派生,则可以节省多余的工作-只需将您的控件视为“标记的文本框”您所需要做的就是从
TextBox
派生并添加所需的依赖属性以适应标签。当然,对于更复杂的用户控件来说,情况并非如此,但在您的情况下,这似乎还可以

不过,这样做的缺点是,您必须使用
TextBox
的默认控件模板,并使用它添加标签,这可能有点棘手


无论如何,我建议您查看一下MSDN上的页面,这在使用WPF编写第一个控件时非常有用。

除非TextBox中有您不想要的内容,否则只需将TextBox子类化即可。或者TextBoxBase。也就是说,属性必须是依赖性属性才能成为绑定目标,并且是(有用的)绑定源(除非您支持INotifyPropertyChanged并在其值更改时引发PropertyChanged。我从未在控件上尝试过后者,所以我不能说它是否有效;我使用片段生成DPs,所以它们没有什么大麻烦。)因此,有些可能不需要是DPs。“基本上,他们只是将我的用户控件的属性重定向到同名文本框的属性”——他们为什么要这样做?例如,您的
UserControl.Width
Height
属性为什么不能控制用户控件本身的宽度和高度?您是否应该根据容器的尺寸(即
UserControl
)来布局
文本框和其他子项?如果您确实希望轻松通过,那么您只需创建一个
ControlTemplate
并在内部使用
{TemplateBinding}
,而不是一个完整的
UserControl
@EdPlunkett没有考虑过这一点。但是,如果这样做,我不需要在XAML中将“real”TextBox的每个属性手动绑定到从TextBox类继承的用户控件的属性吗?类似于
//Untested code
@PeterDuniho在高度和宽度方面你是对的(谢谢你,我会纠正我的方法),但是所有其他属性呢?是的,你必须绑定你想要传递的东西,但至少你不必浪费时间重新定义属性。另请参见@PeterDuniho对模板和模板绑定的介绍——这样做会有点不同。