订阅属性更改事件以更新文本块的样式

本文关键字:文本 更新 样式 事件 属性 | 更新日期: 2023-09-27 18:36:46

我有一个映射到视图的LoggingService。它显示一些修改后的文本。

到目前为止它工作正常,但是想根据LoggingType修改我的文本颜色。

我的问题是我找不到应该在哪里订阅 LoggingService 属性更改事件以调用以下UpdateTextStyle方法:

    private void UpdateTextStyle(ILoggingService logging, string propertyName)
    {
        var loggingType = logging.GetUserLevelLatestLog().Key;
        switch (loggingType)
        {
            case LoggingTypes.Error:
                View.UserInfoLogsTextBlock.Foreground = new SolidColorBrush(Colors.Red);
                View.UserInfoLogsTextBlock.FontWeight = FontWeights.Bold;
                break;
        ...
        }
    }

下面是映射到 VM 中的视图的属性:

    public ILoggingService LoggingService   
    {
        get
        {
            if (_loggingService == null)
            {
                _loggingService = Model.LoggingService;
            }
            return _loggingService;
        }
    }

提前感谢!

订阅属性更改事件以更新文本块的样式

不要对属性更改事件使用,除非您知道在 WPF 中执行的操作。您将导致内存泄漏。

我假设你的LoggingService绑定到你(我假设)XAML 中的TextBox

因此,我建议您创建一个IValueConverterLoggingTypes Style然后通过转换器将TextBox.Style绑定到LoggingService.LoggingType

<UserControl>
   <UserControl.Resources>
       <LoggingStyleConverter x:Key="LoggingStyleConverter" />
   </UserControl.Resources>
   <TextBox
        Text="{Binding Path=Foo.Bar.LoggingService.Text}"
        Style="{Binding Path=Foo.Bar.LoggingService.Type 
                  Converter={StaticResource LoggingStyleConverter}}"
   />
</UserControl>

public class LoggingStyleConverter : IValueConverter
{
    public object Convert(object value, blah blah blah)
    {
        var type = (LoggingTypes)value;
        switch (type)
        {
            case blah:
                return SomeStyle;
            default:
                return SomeOtherStyle;
        }
    }
}