Пользовательский контроль смешиваемости wp7 - PullRequest
1 голос
/ 28 сентября 2011

Привет, я хотел бы сделать просто пользовательский элемент управления

<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 я могуне вижу "test in a message"

есть способ, который работает :) без использования xmlns: MyControl = ...

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Большинство людей считают, что элемент управления является Blendable, если вы можете редактировать его шаблон.Для этого вам придется изменить его с пользовательского на пользовательский элемент управления, чтобы его шаблон был определен в gerenic.xaml.

Однако из ваших комментариев кажется, что вам нужно время разработкиданные, а не иметь возможность сделать элемент управления Blendable.Взгляните на раздел MSDN о атрибутах времени разработки в Silverlight .В частности d:DataContext, это отлично работает в WP7.

0 голосов
/ 29 сентября 2011

в дополнение к ответу 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>

Надеюсь, это поможет. :)

EDIT

На самом деле, как указал Колин, вам не нужен обратный вызов, если вы называете свой usercontrol и используете привязку ElementName вместо обычной привязки.

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

Внутри TextBlock вы делаете

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

Простое связывание с testMessage не будет работать, поскольку это свойство принадлежит пользовательскому элементу управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...