如何更新WPF自定义样式的一部分

时间:2010-09-06 14:26:53

标签: wpf xaml custom-controls properties styles

我创建了一个自定义窗口控件(从Window继承),除状态栏的文本外,一切都很好。我在我的控件中添加了一个名为“StatusText”的新属性,这个文本显示在我控件风格的TextBlock中。

但是当我更改窗口的StatusText属性时,文本不会更改,它不会更新。另一方面,如果我更改了我的窗口的Title属性(这是一个继承的属性),标题会正确更改。

所以也许我没有正确声明我的StatusText属性?或者我需要明确要求我的样式中的TextBlock更新?

感谢您的帮助。

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 个答案:

答案 0 :(得分:1)

在包含INotifyPropertyChanged的班级中实施StatusText,然后在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
}

答案 1 :(得分:0)

除了在Eugene上面回答的实现INotifyPropertyChanged接口之外,您可能还需要在自定义窗口类构造函数中设置DataContext = this。那么你不应该需要RelativeSource绑定。

除非您将自定义窗口的DataContext用于其他目的。