WPf Binding Issue - PullRequest
       2

WPf Binding Issue

1 голос
/ 08 декабря 2010

Я создал пользовательский элемент управления в WPF, и у меня возникают проблемы с его привязкой. Если я явно установлю значение свойства в коде, то все будет работать нормально.

Вот XAML для TextBox в моем контроле:

<TextBox Name="txtText" Grid.Row="0" Grid.Column="0" IsReadOnly="True" Text="{Binding Text, Mode=OneWay}" />

И соответствующие свойства в коде следующие:

public static readonly DependencyProperty TextConverterProperty = DependencyProperty.Register("TextConverter", typeof(IValueConverter), typeof(Selector));
public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector));

public string Text
{
    get
    {
        string result = this.EntityId.ToString();

        if (this.TextConverter != null)
        {
            result = this.TextConverter.Convert(result, null, null, null) as string;
        }

        return result;
    }
}

public long EntityId
{
    get
    {
        return (long)this.GetValue(EntityIdProperty);
    }
    set
    {
        this.SetValue(EntityIdProperty, value);

        this.OnPropertyChanged("Text");
        this.OnPropertyChanged("EntityId");
    }
}

public IValueConverter TextConverter
{
    get
    {
        return this.GetValue(TextConverterProperty) as IValueConverter;
    }
    set
    {
        this.SetValue(TextConverterProperty, value);
    }
}

А теперь реализация XAML на моей странице:

<controls:Selector x:Name="txtReferringCase" EntityId="{Binding ReferringDACaseId}" TextConverter="{StaticResource daCaseNumberConverter}" Grid.Column="5" Grid.Row="0" Grid.ColumnSpan="3" ButtonClicked="txtReferringCase_ButtonClicked" />

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

_caseScreen = new DACaseScreen(itemId);
this.DataContext = _caseScreen;
//this.txtReferringCase.EntityId = _caseScreen.ReferringDACaseId;

РЕДАКТИРОВАТЬ: еще одну вещь, которую я забыл упомянуть ... Если я достиг точки останова и проверил свойства EntityId и Text элемента управления, они оба показывают значения, которые я ожидал. Похоже, пользовательский интерфейс просто не обновляется.

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Методы получения и установки для DependencyProperties должны вызывать только GetValue и SetValue, поскольку XAML не использует их, они предназначены только для удобства.Если вы хотите дополнительного поведения, зарегистрируйте ваш DependencyProperty, передавая обработчик изменений, который делает то, что вы хотите.

public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector),new UIPropertyMetadata(EntityIdChanged));

public long EntityId
{
    get
    {
        return (long)this.GetValue(EntityIdProperty);
    }
    set
    {
        this.SetValue(EntityIdProperty, value);
    }
}

private static void EntityIdChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var control = (Selector)sender;
    control.OnPropertyChanged("Text");
}

Вам не нужно вызывать PropertyChanged для свойств зависимости.Мне также нужно было изменить привязку txtText в вашей UserControl настройке источника для самого элемента управления, а не его DataContext, но если установка свойства в коде сработала для вас, все должно быть в порядке.Возможно, вы захотите переименовать свой элемент управления, поскольку имеется встроенный элемент управления, называемый Selector, но это не так важно.

0 голосов
/ 08 декабря 2010

Ваш пользовательский интерфейс не будет обновляться, пока вы не сделаете OnPropertyChanged звонок. Установка DataContext не сработает.

Кроме того, вы делаете:

public static readonly DependencyProperty TextConverterProperty = DependencyProperty.Register("TextConverter", typeof(IValueConverter), typeof(Selector));
public static readonly DependencyProperty EntityIdProperty = DependencyProperty.Register("EntityId", typeof(long), typeof(Selector));

Но вы не регистрируете зависимость Text, только TextConverter и EntityId. То есть, ваш OnPropertyChanged не будет работать (?) (Или вы просто забыли показать эту строку здесь :))

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