Как обновить часть пользовательского стиля WPF - PullRequest
0 голосов
/ 06 сентября 2010

Я создал пользовательский элемент управления окна (унаследованный от Window), все в порядке, кроме текста моей строки состояния. Я добавил новое свойство в свой элемент управления с именем «StatusText», и этот текст отображается внутри TextBlock в стиле моего элемента управления.

Но когда я изменяю свойство StatusText моего окна, текст не меняется, он не обновляется. С другой стороны, если я изменю свойство заголовка моего окна (которое является унаследованным свойством), заголовок будет изменен правильно.

Так, может быть, я не правильно объявил свое свойство StatusText? Или мне нужно явно попросить обновить текстовый блок в моем стиле?

Спасибо за вашу помощь.

Объявление свойства StatusText:

    private string m_StatusText;

    public string StatusText
    {
        get { return m_StatusText; }
        set { m_StatusText = value; }
    }

Стиль XAML для строки состояния:

<!-- Status area -->
<Border Grid.Row="2" Style="{DynamicResource SFM_StatusAreaStyle}" CornerRadius="0, 0, 7, 7" BorderThickness="1, 1, 1, 0">
    <Grid Style="{DynamicResource SFM_TitleBarStyleReflect}">
          <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Margin="6, 0, 0, 2" Foreground="{DynamicResource B_TextColor}" 
                                Text="{Binding Path=StatusText, RelativeSource={RelativeSource AncestorType={x:Type local:SiluForm}, Mode=FindAncestor}}" />
    </Grid>
 </Border>

Ответы [ 2 ]

1 голос
/ 06 сентября 2010

Реализуйте INotifyPropertyChanged в своем классе, содержащем StatusText, а затем вставьте код rasing PropertyChanged в сеттер StatusText:

public class MyClass : INotifyPropertyChanged
{
    private string m_StatusText;

    public string StatusText
    {
        get { return m_StatusText; }
        set 
        { 
             m_StatusText = value; 
             raiseOnPropertyChanged("StatusText");
        }
    }

   #region Implementation of INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        private void raiseOnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
}
0 голосов
/ 07 сентября 2010

В дополнение к реализации интерфейса INotifyPropertyChanged, как Юджин ответил выше, вам также может потребоваться установить DataContext = this в конструкторе пользовательских оконных классов. Тогда вам не нужно привязывать RelativeSource.

Если вы не используете DataContext пользовательского окна для других целей.

...