2009-10-27 7 views
6

Я использую WPF и шаблон MVVM в моем пользовательском интерфейсе. В моей модели ViewModel у меня есть список, содержащий расстояния в миллиметрах, которые я показываю в ListView, привязывая ListView.ItemsSource к списку. Тем не менее, я хотел бы, чтобы отображаемые значения использовали более естественную единицу - метры или футы в зависимости от состояния «метрики».WPF и MVVM: изменение конвертера привязки данных во время выполнения

Я написал несколько простых классов, MillimetresToMetresConverter и MillimetresToFeetConverter, оба из которых реализуют IValueConverter. Хотя я могу установить свойство Converter при привязке данных к одному или другому, я не уверен, как изменить эти конвертеры при изменении состояния флажка.

Мой план состоял в том, чтобы на моем ViewModel поле «IValueConverter lengthConverter», которое я мог установить на один конвертер или другой, а затем в моем XAML do ...="{Binding Converter={Binding Path=lengthConverter}}" - к сожалению, это не работает, поскольку конвертер не является свойством зависимостей.

Как изменить конвертер, используемый привязкой данных во время выполнения?

+0

Вы должны иметь возможность использовать DependencyObject.GetBinding (DependencyProperty), например. myTextBlock.GetBinding (TextBlock.TextProperty), чтобы получить (и изменить) объект привязки. – Heinzi

+0

К сожалению, следующий за шаблоном MVVM означает, что код должен будет жить в ViewModel, который не имеет ссылки на представление и, таким образом, не может касаться «myTextBlock». – user200783

ответ

0

Если я могу предложить простое альтернативное решение: создайте небольшой малый FormatMillimetresConverter в вашей ViewModel, чье свойство UseMetric связано с меткой.

+0

Спасибо - но как только у меня есть FormatMillimetresConverter в ViewModel, как мне заставить ListView использовать его? – user200783

+0

Хорошая точка. :-) Вы можете экспортировать один экземпляр его как статическое свойство вашего ViewModel, а затем получить его через «... Converter = {x: Static local: ViewModel.MyFormatMillimetresConverter}», но почему-то это не очень элегантно ... – Heinzi

+0

Как насчет создания FormatMillimetresConverter в ? Затем он доступен как статический ресурс, и вы можете присоединить его в качестве конвертера к элементу ListView.ItemsSource с помощью «... Converter = {StaticResource ...» и к флажку с «{Binding Source = {StaticResource ...]. – Heinzi

5

В большинстве случаев при использовании методологии MVVM вы можете выполнить задачу форматирования в классах VM. В вашем случае вы можете добавить свойство Format в класс VM и на основе значения свойства Format вернуть хорошо сформированную строку.

Для получения дополнительной информации см. this discussion.

+0

Точно. Конвертеры очень редки в приложении MVVM, обычно появляются только в пользовательских элементах управления. –

+0

Предположим, что у моего ViewModel есть свойство «Список Расстояния», с которым я связываю свой ListView.ItemsSource. Вы предлагаете, чтобы вместо Distances.get возвращал список as-is, он должен возвращать другой список - с уже примененным преобразованием? – user200783

+0

@Paul: да. ViewModel - это просто ValueConverter ;-). Вы можете прочитать аналогичную дискуссию на дискуссионной панели WPF Disciples: http://groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e –