Привязка данных и преобразователи WPF

Я пытаюсь привязать данные к списку следующим образом:

<ListBox x:Name="MyListBox" Margin="0,0,0,65">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Converter={StaticResource MyConverter}}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Причина, по которой я привязываюсь ко всему объекту, а не к свойству, заключается в том, что моему преобразователю потребуется несколько свойств объекта для построения возвращаемой им строки.

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

Что я могу сделать по-другому? Я не могу привязываться к одному свойству, так как мне нужен весь объект в преобразователе... И ConverterParameter уже используется.


person Kelly    schedule 21.10.2009    source источник
comment
Я могу заставить его работать, если создам оболочку вокруг своего объекта, которая реализует INotifyPropertyChanged с одним свойством моего объекта. Затем привяжите к этому свойству. Но мне также нужно, чтобы оболочка реализовала метод для явного вызова при изменении коллекции, чтобы событие могло вызывать PropertyChanged... Похоже на ужасный хак...   -  person Kelly    schedule 22.10.2009


Ответы (2)


Помните, что если вы выполняете привязку к «основному» свойству, а значение самого основного свойства не изменяется, у привязки не будет причин обновлять себя. Он понятия не имеет, что ваш конвертер на самом деле основан на подсвойстве. Что вы можете сделать, так это использовать MultiBinding. где вы привязываете не только «основное» свойство, но и определенное подсвойство. Это дает вашей реализации IMultiValueConverter доступ к основной объект данных, но поскольку вы также привязываетесь к изменяющемуся подсвойству, он также будет обновляться при изменении значения этого подсвойства.

person Drew Marsh    schedule 21.10.2009
comment
О, хорошая идея. Никогда не думал об этом. Я попробую. - person Kelly; 22.10.2009
comment
Работает идеально! Спасибо, я бился над этим большую часть дня.. - person Kelly; 22.10.2009

Вы можете попробовать использовать MultiBinding, который я верить обновлениям всякий раз, когда запускается любая из его привязок. Вы также можете использовать IMultiValueConverter или просто воспользоваться StringFormat привязки.

person Community    schedule 21.10.2009