Что не так с моим связыванием? - PullRequest
0 голосов
/ 16 декабря 2010

Я работаю над приложением, использующим протокол TCP.Я хочу показать разные статусы сообщения в разных цветах (подключить = зеленый, отключить = красный)

Я определил перечисление:

public enum ComunicationStateTypeEnum
    {
        COMUNICATION_CONNECTED,

        COMUNICATION_DISCONNECTED

    };

Я определил класс преобразования:

namespace Conversion
{
[ValueConversion(typeof(ComunicationStateTypeEnum), typeof(Brushes))]
public class ComStatusToColor : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        ComunicationStateTypeEnum state = (ComunicationStateTypeEnum)value;
        if (state == ComunicationStateTypeEnum.COMUNICATION_CONNECTED)
            return Brushes.Green;
        return Brushes.Red;            
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

}

}

В Xaml я определил эллипс:

 <Ellipse Name="ComEllipse" Height="25" Width="30" Fill ="{Binding Path=eCommStatus, Converter={StaticResource ComStatusToColor}}" Stroke="Black" DockPanel.Dock="Left"/>

также в Xaml я определил:

xmlns:ConversionNamespace="clr-namespace:Conversion"    
<Window.Resources>        
    <ConversionNamespace:ComStatusToColor x:Key="ComStatusToColor"/>
</Window.Resources>

Я хочу привязать ксуществующий объект, поэтому я инициировал:

ComEllipse.DataContext = SystemLogic.GetInstance();

(SystemLogic является синглтоном)

и в SystemLogic я определил:

public class SystemLogic
{
public ComunicationStateTypeEnum eCommStatus { get; set; }
...
}

eCommStatus инициируется для COMUNICATION_DISCONNECTED вконструктор и эллипс становятся красными, а когда член eCommStatus изменяется на COMUNICATION_CONNECTED, эллипс не меняет свой цвет

Что не так?

Gil

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

Вам необходимо реализовать интерфейс INotifyPropertyChanged в вашем классе SystemLogic, чтобы пользовательский интерфейс знал, что значение свойства изменилось. Таким образом, пользовательский интерфейс может обновлять себя.

Пример

public class SystemLogic : INotifyPropertyChanged
{
    private ComunicationStateTypeEnum _eCommStatus;
    public ComunicationStateTypeEnum eCommStatus
    {
        get
        {
            return _eCommStatus;
        }
        set
        {
            _eCommStatus = value;
            RaisePropertyChanged("eCommStatus");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void RaisePropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler temp = PropertyChanged;
        if (temp != null)
        {
            temp(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
0 голосов
/ 16 декабря 2010

Ничего плохого в вашей привязке.Но SystemLogic должен реализовать INotifyPropertyChanged , чтобы отчитываться при его изменении.

public class SystemLogic
{
    private ComunicationStateTypeEnum _eCommStatus;
    public ComunicationStateTypeEnum eCommStatus 
    { 
        get{return _eCommStatus;} 
        set
        {
            _eCommStatus = value;
            OnPropertyChanged("ComunicationStateTypeEnum");
        }
    }
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...