Jef*_*eff 6 wpf xaml dependency-properties
假设我有一个自定义控件包装另一个控件(例如MyCustomButton).我公开了一个包含内部控件的属性Content:
public object Content
{
get { return innerControl.Content; }
set { innerControl.Content = value; }
}
Run Code Online (Sandbox Code Playgroud)
为了让使用者绑定到此属性,我需要为它定义一个DependencyProperty:
public static DependencyProperty ContentProperty = DependencyProperty.Register("Content", typeof (object), typeof (MyCustomButton));
Run Code Online (Sandbox Code Playgroud)
但现在我需要我的属性定义来使用GetValue/SetValue:
public object Content
{
get { return GetValue(ContentProperty); }
set { SetValue(ContentProperty, value); }
}
Run Code Online (Sandbox Code Playgroud)
所以我不再包含内部控件的值了.
我可以定义PropertyMetadata来处理DependencyProperty的PropertyChanged事件,但是我需要一堆管道代码来保持值同步并防止无限制的环回更改.
更新:我不能只从Button派生,因为我的UserControl有各种其他问题.
有一个更好的方法吗?
那么,根据您使用用户控件包装按钮的具体原因,您可以定义一个继承自按钮的自定义控件。然后,您可以简单地重写要定义自定义控件行为的方法和属性,而不是包装按钮并公开所需的包装方法和属性。这样,您将获得按钮的所有功能,而无需重新发明轮子。
这是一个谷歌链接,可以引导您完成它(我发现的第一个链接 - 有很多):http://knol.google.com/k/creating-custom-controls-with-c-net#
如果用户控件有其他问题,这可能不适合您,但我提供这个答案是因为您提到的唯一目的是包装按钮。如果所讨论的控件只是意味着更具体类型的包装/继承控件(即您的情况下的按钮),我个人倾向于创建自定义控件并继承,而不是用户控件和包装。
编辑:根据更新的问题...
你可以按照这些思路做一些事情。以下是用户控件客户端的 XAML:
<Grid>
<local:MyControl ButtonContent="Click Me!"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
以下是用户控件本身的 XAML:
<UserControl x:Class="GuiScratch.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GuiScratch"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<StackPanel>
<ContentControl Content="Asdf"/>
<Button Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyControl}},Path=ButtonContent}"/>
</StackPanel>
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
并且,这是背后的代码:
public partial class MyControl : UserControl
{
public static readonly DependencyProperty ButtonContentProperty =
DependencyProperty.Register("ButtonContent", typeof(object), typeof(MyControl),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));
public object ButtonContent
{
get { return (object)GetValue(ButtonContentProperty); }
set { SetValue(ButtonContentProperty, value); }
}
public MyControl()
{
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,您根本不需要通过代码处理绑定。您的客户端 XAML 绑定到您的依赖项属性,就像用户控件本身的 XAML 一样。通过这种方式,它们共享依赖属性设置。我在我的小草稿本中运行了这个,结果就是(至少我的理解)你正在寻找的东西。主窗口将用户控件显示为带有文本“Asdf”的堆栈面板,然后是带有文本“Click Me!”的按钮。
归档时间: |
|
查看次数: |
579 次 |
最近记录: |