Добавление IValueConverter прерывает обновления, когда происходят изменения из наблюдаемой коллекции в пользовательский интерфейс - PullRequest
0 голосов
/ 22 марта 2011

У меня есть itemcontrol с шаблоном элемента, установленным на границу, а затем я связываю текст данных представления списка со списком объектов, которые содержат свойство bool.

Затем я добавил обработчик события click к границе, и при обнаружении щелчка я привел datacontext границы к классу и установил для поля bool значение true.

Это работает как шарм, но я хочу, чтобы у прямоугольника был определенный цвет, когда для поля bool установлено значение true или false, поэтому я создал IValueConverter, который принимает мой класс и возвращает цвет. Это тоже работает, прямоугольники разных цветов в зависимости от поля bool.

Я все еще могу щелкнуть прямоугольники, но они просто не обновляются. Цвет прямоугольника не изменится.

Таблица данных из элемента управления элемента

            <DataTemplate>
                <Border ToolTip="{Binding Seat.Column}" Width="25" Height="25" Margin="0,0,2,2" BorderBrush="Black" Background="{Binding Converter={StaticResource ResourceKey=SeatStateConverter}}" BorderThickness="2" Name="rectangle1" VerticalAlignment="Center" HorizontalAlignment="Center" MouseLeftButtonDown="rectangle1_MouseLeftButtonDown">
                    <Label Content="{Binding Occupied}" Foreground="White" FontSize="7"></Label>
                </Border>
            </DataTemplate>

Событие клика

    private void rectangle1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Border item = sender as Border;
        SeatState state = item.DataContext as SeatState;

        state.Locked = !state.Locked;
    }

мой конвертер

        public object Convert(object value, Type targetType, object parameter,   System.Globalization.CultureInfo culture)
        {
            SeatState state = value as SeatState;
            if (state == null)
                return null;

            SolidColorBrush brush = new SolidColorBrush();

            if (state.Occupied)
            {
                brush.Color = Color.FromRgb(172, 0,0);
            }
            else if (state.Locked)
            {
                brush.Color = Color.FromRgb(214, 65, 0);
            }
            else if(!state.Occupied)
            {
                brush.Color = Color.FromRgb(0, 172, 0);
            }

            return brush;
        }

Это прекрасно работает ... пока я не добавлю конвертер, который преобразует объекты в SolidColorBrush.

Я перепробовал всякие сумасшедшие вещи, которые не должны иметь ничего общего с моей проблемой.

  • реализация метода конвертации в интерфейсе IValueConverter
  • установка привязки к двусторонней привязке
  • вызов UpdateLayout метод на ItemsControl

Но, похоже, ничего не работает.

У кого-нибудь есть идеи? Мой английский мог бы быть лучше, поэтому, пожалуйста, спросите, есть ли что-то, что вы хотите уточнить =)

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Я думаю, что вы привязываетесь к объекту SeatState - тогда как вам на самом деле нужно привязать к некоторой комбинации свойств Occupied и Locked?

, т. Е. Меняется не сам объект SeatState,скорее это пара свойств SeatState.

Может быть, каким-то образом объединить свойства и установить это объединенное свойство как Путь для фона XAML.

например, в SeatState

private bool _Locked
public bool Locked
{
get
{
   return _Locked;
}
set
{
   _Locked = value;
   NotifyPropertyChange("Locked");
   NotifyPropertyChange("LockedAndOccupied");
}
}

private bool _Occupied
public bool Occupied
{
get
{
   return _Occupied;
}
set
{
   _Occupied = value;
   NotifyPropertyChange("Occupied");
   NotifyPropertyChange("LockedAndOccupied");
}
}

public Tuple<bool, bool> LockedAndOccupied
{
   get
   {
       return new Tuple<bool, bool>(Locked, Occupied);
   }
}

, затем в XAML вы можете привязать к Path=LockedAndOccupied, Converter=...

Очевидно, вам также придется изменить код конвертера - я будупозвольте вам сделать это!


В качестве альтернативы ... теперь я прочитал об этом ...

Есть нечто, называемое MultiBinding - http://www.switchonthecode.com/tutorials/wpf-tutorial-using-multibindings - выглядитидеально подходит для ваших нужд

Что-то вроде:

<Border.Background>
<MultiBinding Converter="{StaticResource aNewConverter}">
   <Binding Path="Locked"/>
   <Binding Path="Occupied"/>
</MultiBinding> 
</Border.Background>

Сегодня вечером я узнал что-то новое:)

0 голосов
/ 22 марта 2011

Проверьте привязку фона ... похоже, ваш путь отсутствует.Я ожидал бы увидеть что-то вроде ...

Background="{Binding Path=., Converter={StaticResource ResourceKey=SeatStateConverter}}"

В качестве альтернативы вы можете попробовать установить BindsDirectlyToSource = true.

Подумав, вам, возможно, потребуется реализовать IMultiValueConverter, а затем связать каждый из них.свойств отдельно.Это может быть то, что вам нужно сделать, чтобы получать уведомления об изменениях для каждого из свойств. Вот пример реализации IMultiValueConverter из MSDN.

Кроме того, вы можете проверить свою реализацию INotifyPropertyChanged ... неправильное написание имен свойств нарушит уведомления об изменениях ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...