#wpf #image #datagrid #visibility #converter
#wpf #изображение #сетка данных #видимость #конвертеры
Вопрос:
Я натыкаюсь на этот материал для преобразования данных, особенно в отношении нескольких строк и динамического отображения / скрытия изображения.
Давайте рассмотрим основные / подробные данные с точки зрения. В заданном представлении (презентации) у меня есть информация о заголовке и таблица данных, показывающая множество позиций. Перед сохранением позиций могут быть одна или несколько строк с отсутствующими / недопустимыми данными. Я хочу отобразить графическое изображение слева от элемента строки, дающее пользователю некоторый визуальный сигнал об этом…эй, эту строку нужно исправить…
Итак, у меня есть datatable в моей ViewModel, в котором есть дополнительный столбец, указывающий, есть ли ошибки, связанные со строкой, поскольку логическое значение, поскольку типы столбцов datatable понятия не имеют, как обрабатывать тип данных wpf «видимость». Это данные.DefaultView является фактической основой отображения данных (которая работает). Я просто застрял на этом финале, чтобы изображение правильно динамически отображалось / скрывалось.
Я читал о конвертерах, и у меня есть класс, который ничего не делает, но действует как конвертер. Итак, я могу предложить следующее только тем, кто может предложить помощь.
Моя ViewModel имеет свойство, предоставляющее DefaultView
public DataView MyDetailView
{ get { return MyTable.DefaultView; }}
Для простоты эта таблица состоит из двух столбцов..
RecordIsInvalid (boolean),
LineItem (int)
Ответ №1:
Использование привязки BooleanToVisibilityConverter должно быть довольно простым:
<Image Visibility="{Binding RecordIsInvalid,
Converter={StaticResource BooleanToVisibilityConverter}}" ... />
Но, насколько я понимаю, у вас есть один RecordIsInvalid
флаг и LineNumber
, которые ссылаются на определенную строку. Что на самом деле привязано к каждой строке? Есть ли у вас что-то вроде ItemViewModel, которые соответствуют каждой строке? В принципе, каждый элемент должен отвечать за проверку своего собственного состояния и предоставлять IsValid
свойство, таким образом, все было бы намного проще, так что вы могли бы просто привязываться к IsValid
области видимости каждого элемента grid view.
РЕДАКТИРОВАТЬ: Ответ на комментарий
Вы не должны создавать экземпляр и предоставлять конвертер самостоятельно.
- Поместите класс конвертера в какое-нибудь подходящее пространство имен, например
MyProject.GUI.Converters
- В View.xaml добавьте псевдоним пространства имен для Converetrs, см. *1
- Добавьте конвертер в ресурсы управления / окна в XAML, см. *2
*1: MyView.xaml
<UserControl ...
xmlns:Converters="clr-namespace:MyProject.GUI.Converters" />
*2: MyView.xaml
<UserControl.Resources>
<Converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
</UserControl.Resources>
Комментарии:
1. Это не обрабатывается отдельной моделью представления. Это просто dataview, который отображается в модели ОСНОВНОГО представления. Что касается конвертера, в настоящее время у меня есть это как отдельный класс, которого нет в самой модели представления. Каков наилучший способ сделать конвертер доступным … как созданный экземпляр класса и предоставить его в качестве свойства для DataContext представления, чтобы разрешить его отображение? Я все еще изучаю кучу этих сложных ссылок на привязку XAML к ViewModel, статическую ссылку и т.д.
2. Да … это сделало это. Изначально я не понимал контекста, но ваш наглядный пример для одного элемента (в отличие от множества супер вложенных) привел меня прямо к сути… Спасибо