2013-04-19 3 views
1

Я создал кнопку, которая, как предполагается, поддерживает перенос слов. Мой XAML код кнопки выглядит следующим образом:Изменение свойства зависимостей от кода не отображается

<Button x:Class="POS.TouchScreen.UI.Elements.TouchButtonWPF" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" Height="23" HorizontalAlignment="Left" Name="buttonGrid" VerticalAlignment="Top" Width="75" BorderBrush="#FF8A97A9" Margin="4" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <TextBlock Name="ButtonTextBlock" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       Text="{Binding ButtonText, Mode=TwoWay}" 
       TextWrapping="Wrap"> 
    </TextBlock> 
</Button> 

Я реализовал свойство, как показано ниже:

public static readonly DependencyProperty ButtonTextProperty = 
    DependencyProperty.Register("ButtonText", typeof(string), typeof(TouchButtonWPF), new UIPropertyMetadata("Button",new PropertyChangedCallback(OnButtonTextChanged), new CoerceValueCallback(OnCoerceButtonText))); 

private static object OnCoerceButtonText(DependencyObject o, object value) 
{ 
    TouchButtonWPF button = o as TouchButtonWPF; 
    if (button != null) 
     return button.OnCoerceButtonText((string)value); 
    else 
     return value; 
} 

protected virtual string OnCoerceButtonText(string value) 
{ 
    return value; 
} 

private static void OnButtonTextChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    TouchButtonWPF button = o as TouchButtonWPF; 
    if (button != null) 
     button.OnButtonTextChanged((string)e.NewValue, (string) e.OldValue); 
} 

protected virtual void OnButtonTextChanged(string NewValue, string OldValue) 
{ 
    this.ButtonTextBlock.Text = NewValue; 
}   

public string ButtonText 
{ 
    get { return (string)GetValue(ButtonTextProperty); } 
    set { SetValue(ButtonTextProperty, value); } 
} 

Вставка экземпляра TouchButtonWPF выглядит следующим образом

<tse:TouchButtonWPF ButtonText="OK" FontSize="16" Height="77" HorizontalAlignment="Left"x:Name="buttonOk" Width="85" />     

Это работает отлично, и текст кнопки отображается правильно. Однако, когда я назначаю ButtonText из кода C#, текст не обновляется. Я назначаю переменную, как показано ниже.

touchButton.ButtonText = navButton.Caption; 

Может ли кто-нибудь сказать мне, что я делаю неправильно? Обратите внимание, что обработчики событий были реализованы, когда они не работали изначально, не могут понять, нужны ли эти обработчики событий вообще для тех возможностей, которые я пытаюсь достичь?

Посмотрите вперед читать ваши ответы :)

+0

Любые отладочные идеи? Вызывается вызов 'OnButtonTextChanged()'? –

+0

Я скопировал ваш код, и он работает нормально с обработчиками событий и без них, вы уверены, что navButton.Caption использует другой текст, чем исходный текст? :) – dnr3

ответ

4

Ваша проблема заключается в том, что вы устанавливаете свойство зависимостей непосредственно (this.ButtonTextBlock.Text = NewValue).

До этого момента значение этого.ButtonTextBlock.Text было установлено на Binding. Замена привязки локальным значением удалила привязку, и текст больше не будет отвечать на исходное выражение привязки.

заменить - this.ButtonTextBlock.Text = Value;

с - this.ButtonTextBlock.SetCurrentValue(TextProperty, value);

Это установит значение без сдувания привязками

+2

Привет, Дин. Спасибо за ваш ответ. Я попытался изменить 'this.ButtonTextBlock.SetCurrentValue (TextBlock.TextProperty, NewValue);' Для 'this.ButtonTextBlock.Text = NewValue;' Однако я до сих пор не отображается текст, когда я присвоить свойство из кода , – nukolai

 Смежные вопросы

  • Нет связанных вопросов^_^