Вопрос привязки данных Silverlight UserControl - PullRequest
0 голосов
/ 29 августа 2011

Я только начинаю с Expression Blend и пытаюсь создать пользовательский UserControl, который предоставляет свойство боковому меню Properties элемента управления, которое обновляет различные аспекты представления.Например, я хочу выставить свойство с именем «Текст» в боковом меню «Свойства» в Blend, которое привязывается к TextBlock внутри UserControl.

Вот XAML UserControl:

<UserControl
    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"
    x:Class="XDAFacebook.XFItemGrid"
    d:DesignWidth="148" d:DesignHeight="200">

    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid>
            <Grid Height="148" Margin="0" VerticalAlignment="Top">
                <Image Height="148" Margin="0" Source="feeds.png" Stretch="Fill" VerticalAlignment="Bottom">
                    <Image.Clip> 
                        <RectangleGeometry RadiusX="10" RadiusY="10" Rect="0,0,148,148" /> 
                    </Image.Clip> 
                </Image>
                <Rectangle Fill="#00EBEBEC" Margin="0,0,0,0" Stroke="#FFB5B5B5" StrokeThickness="2" RadiusX="10" RadiusY="10"/>
            </Grid>
            <TextBlock x:Name="MainText" Height="33" Margin="8,0,11,13" TextWrapping="Wrap" Text="{Binding Text}" VerticalAlignment="Bottom" Foreground="#FF606060" HorizontalAlignment="Center" FontWeight="Bold" FontSize="24"/>
        </Grid>
    </Grid>
</UserControl>

А вотэто код для этого элемента управления:

[Description("Items for Main Grid")]
public partial class XFItemGrid : UserControl
{
    public XFItemGrid()
    {
        // Required to initialize variables
        InitializeComponent();
    }

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", 
        typeof(string), 
        typeof(XFItemGrid), 
        new PropertyMetadata(OnTextChanged));

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((XFItemGrid)d).Text = (String)e.NewValue;
    }

    [Description("Main Text to be displayed in the control")]
    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}

Я вижу свойство «Текст» в разделе «Разное» бокового меню «Свойства», но когда я обновляю его, в TextBlock ничего не меняется.

В конце концов я хотел бы сделать то же самое с источником изображения, но если это будет другой пост, дайте мне знать, и я добавлю его в другой.

РЕДАКТИРОВАТЬ -

Данг, я нашел ошибку ..... Я серьезно думал, что схожу с ума!Но оказывается, что я никогда не устанавливал свойство правильно.

Вот код, который нужно изменить:

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((XFItemGrid)d).Text = (String)e.NewValue;
    }

на:

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((XFItemGrid)d).MainText = (String)e.NewValue;
    }

Бла,Я надеюсь, что поможет!Убедитесь, что вы на самом деле измените свойство!

1 Ответ

1 голос
/ 29 августа 2011

Вы должны извлечь свойство text в объект модели и реализовать для него INotifyPropertyChanged, чтобы при его изменении он уведомлял все элементы управления.Поскольку XAML не имеет какой-либо модели поддержки, к которой вы привязываетесь, просто напрашивается на неприятности.

...