Пользовательские элементы управления Silverlight и свойство Dependancy Проблема - PullRequest
1 голос
/ 09 марта 2009

У меня есть пользовательский элемент управления с именем Field:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" Name="LblName"/>
    <TextBox Grid.Row="0" Grid.Column="1" HorizontalContentAlignment="Left" Name="TxtValue"/>
</Grid>

В CS-файле я раскрываю нижеприведенное свойство, которое просто устанавливает значение ".text" для текстового поля.

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value",
        typeof(string),
        typeof(Field),
        new PropertyMetadata(
            default(string),
            (source, args) => (source as Field).TxtValue.Text = (string)args.NewValue
        )
    );

    [Category("Custom")]
    public string Value
    {
        get
        {
            return (string)this.GetValue(ValueProperty);
        }
        set
        {
            this.SetValue(ValueProperty, value);
        }
    }

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

Подробно описывая общую картину, у меня есть страница сведений о клиенте, некоторые элементы управления привязаны к объекту клиента, который содержится в наблюдаемой коллекции. Если я изменю значение текстового поля (которое содержится в элементе управления Field) на странице с «xxxx» на «yyyy», я всегда получаю обратно «xxxx». Кажется, что-то не так где-то вокруг геттера?

1 Ответ

1 голос
/ 19 августа 2009

Это определенно шаг в правильном направлении для распространения свойств.

Если это настоящий пользовательский элемент управления (производный от Control), вам следует использовать {TemplateBinding Value}, плюс вам, вероятно, следует также подключиться к событию TextChanged в TextBox после настройки части шаблона в методе OnApplyTemplate , Таким образом, вы также можете обновить базовое свойство зависимостей TxtValue.

Если это UserControl, вы можете использовать Binding, но у вас есть несколько вариантов. Как только он у вас есть, функция обратного вызова, изменяющая ваше свойство, движется только в одном направлении: вы устанавливаете только текстовое значение, вы никогда не реагируете на него.

Будем надеяться, что документация там улучшится.

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