用户控制可混合性wp7

时间:2011-09-28 16:51:39

标签: xaml windows-phone-7 user-controls

您好我想做一个简单的用户控制

<UserControl x:Class="TestDependencyProps.controls.TestControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    d:DesignHeight="480" d:DesignWidth="480">

    <Grid x:Name="LayoutRoot" >
        <TextBlock Height="30" Margin="31,140,27,0" Name="textBlock1" Text="{Binding testMessage}" VerticalAlignment="Top" />
    </Grid>

</UserControl>

代码背后:

public partial class TestControl : UserControl
{
    public string testMessage
    {
        get { return (string)GetValue(testMessageProperty); }
        set { SetValue(testMessageProperty, value); }
    }


    public static readonly DependencyProperty testMessageProperty =
        DependencyProperty.Register("testMessage", typeof(string), typeof(TestControl),new PropertyMetadata("test in a message",null)
        );

    public TestControl()
    {
        InitializeComponent();
    }
}

现在一切正常但是不可混合......而在Cider中我看不到“在消息中测试”

有一种方法可行:)不涉及xmlns:MyControl = ...

2 个答案:

答案 0 :(得分:1)

如果您可以编辑其模板,大多数人会认为控件是Blendable。为此,您必须将其从用户控件更改为自定义控件,以便在gerenic.xaml中定义其模板。

然而,从您的评论中,您似乎需要设计时数据,而不是能够使控件Blendable。请查看design-time attributes in Silverlight上的MSDN部分。特别是d:DataContext,这在WP7中运行得很好。

答案 1 :(得分:0)

除了ColinE的回答之外,您可能需要更改一些代码以使您的依赖项属性与设计时数据一起使用,

    public string testMessage
    {
        get { return (string)GetValue(testMessageProperty); }
        set { SetValue(testMessageProperty, value); }
    }

public static readonly DependencyProperty testMessageProperty =
            DependencyProperty.Register("testMessage", typeof(string), typeof(TestControl), new PropertyMetadata("test in a message", PropertyChangedCallback));

        private static void PropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            if (e.NewValue != null)
            {
                var c = (TestControl)sender;
                // assign value to the TextBlock here
                c.textBlock1.Text = e.NewValue.ToString();
            }
        }

并删除TextBlock Text="{Binding testMessage}"中的绑定。

要在设计时显示文本,您需要添加一个设计时DataContext(就像ColinE建议的那样),

<Grid x:Name="LayoutRoot" d:DataContext="{d:DesignInstance design:DesignMainViewModel, IsDesignTimeCreatable=True}">
    <xxx:TestControl testMessage={Binding SomeText} />
</Grid>

希望这会有所帮助。 :)

修改

实际上,正如Colin指出的那样,如果您命名用户控件并使用ElementName绑定而不是正常绑定,则不需要回调。

<UserControl x:Name="myUserControl" ...

在TextBlock中,你可以

Text="{Binding testMessage, ElementName=myUserControl}"

只需绑定到testMessage就行不通,因为此属性属于UserControl。