2013-10-25 110 views
1

我有一個映射到View的LoggingService。它顯示一些修改過的文字。訂閱屬性更改事件以更新TextBlock的樣式

它迄今爲止工作正常,但是想要根據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; 
     } 
    } 

在此先感謝!

回答

1

不要在屬性更改的事件上使用,除非您知道您在WPF中正在做什麼。您將導致內存泄漏。

我假設你有你的LoggingService在XAML中綁定到你的(我認爲)TextBox

因此,我要建議您LoggingTypesStyle創建IValueConverter然後綁定你的TextBox.StyleLoggingService.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; 
     } 
    } 
} 
+0

非常感謝,它的工作完美! (已經在VM構造函數中註冊了我的事件並且正在工作,但肯定是內存泄漏,並且不是很好的編碼) – goul