2015-07-03 3 views
0

имеют простой XAMLНе похоже, чтобы получить мой IValueConverter работать

<UserControl.Resources> 
     <converters:StateToColorConverter x:Key="stateToColorConverter"/> 
</UserControl.Resources> 
<StackPanel> 
    <Grid Width="150" Height="100" Background="{Binding State, Converter={StaticResource stateToColorConverter}}"></Grid> 
    <Button 
     Width="100" 
     Height="70" 
     Command="{Binding InitializeCommand}">Initialize</Button> 
</StackPanel> 

Его вид модель имеет свойство государства, которое имеет правильное значение.

public class MachineControlViewModel :ViewModelBase 
{ 
    private readonly IMachine machine; 

    public RelayCommand InitializeCommand { get; set; } 

    private MachineStates state; 
    public MachineStates State 
    { 
     get { return state; } 
     set { Set(() => State, ref state, value); } 
    } 

    public MachineControlViewModel(IMachine machine) 
    { 
     this.machine = machine; 

     InitializeCommand = new RelayCommand(Initialize, CanInitialize); 

     State = machine.State; 

     machine.StateChanged += MachineOnStateChanged; 
    } 
    // left out irrelevant parts 
} 

Затем реализация IValueConverter

public class StateToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var state = (MachineStates) Enum.Parse(typeof (MachineStates), value.ToString()); 

     switch (state) 
     { 
      case MachineStates.Idle: 
       return Color.Red; 
      case MachineStates.Initialized: 
       return Color.Green; 
      case MachineStates.Production: 
       return Color.Blue; 
      case MachineStates.Error: 
       return Color.Red; 
     } 

     return null; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Когда я запускаю мое приложение, то BackColor грид не покажет.

Когда я устанавливаю Hardcoded BackColor (так без преобразователя значений), он визуализируется правильно.

Когда я использую свой конвертер значений и помещаю точку останова в метод преобразования, я вижу, что код выполняется просто отлично, и возвращается цвет. Но ничего не показано ...

Что я делаю неправильно?

+0

FYI, вы можете изучить привязки во время выполнения с помощью Snoop. Позвольте вам понять, что конвертер возвращал неправильный тип. – Will

ответ

1

Фон типа кисти. Изменения в конвертере для этого

return new SolidColorBrush(Colors.Red); 

Background property

+0

Это работает. Спасибо (почему бы мне просто не читать лишние страницы MSDN, прежде чем я задам тупой вопрос ..., но thx для того, чтобы помочь мне!) – bas

+0

Если бы вы взглянули на окно вывода, вы бы заметили несовместимые типы, я верю , – Maximus

1

Конвертер должен вернуть Brush, а не Color, так как это тип имущества Background.

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    Brush brush = null; 

    switch ((MachineStates)value) 
    { 
     case MachineStates.Idle: 
      brush = Brushes.Red; 
      break; 
     case MachineStates.Initialized: 
      brush = Brushes.Green; 
      break; 
     case MachineStates.Production: 
      brush = Brushes.Blue; 
      break; 
     case MachineStates.Error: 
      brush = Brushes.Red; 
      break; 
     default: 
      break; 
    } 

    return brush; 
} 

Следует особо не возвращать System.Drawing.Color (как вы это делали), потому что это WinForms, а не WPF.

+0

Хмм, как ни странно, это не работает. Однако ответ выше. Thx за дополнительную информацию! – bas