WPF DataGrid: как получить доступ к DataRow, в котором находится TextBox и т. Д.? - PullRequest
2 голосов
/ 17 июня 2011

Итак, у меня есть столбцы, определенные так:

                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox Text="{Binding Path=COLUMN_NAME, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>

TextBox - не единственный элемент управления, который может существовать в шаблоне данных для столбца, у меня есть DateTimePickers, ComboBoxes и т. Д.

И что я хочу сделать, это определить некоторые триггеры стиля, подобные этому, которые обращаются к какому-либо свойству в DataRow:

            <Style TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding  RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, 
                        Path=Row.RowState}" Value="Modified">
                        <Setter Property="Foreground" Value="LightGreen" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>

Теперь, к сожалению, кажется, что текстовые поля никогда не являются логическими потомками DataGridRows. Так в чем же решение? Конечно, я могу создать триггер, который нацелен на сами DataGridRows, но это избыточно, потому что установка свойства переднего плана ничего не даст (TextBoxes и другие элементы управления располагаются впереди).

Любая помощь наиболее ценится. Фуга

РЕДАКТИРОВАТЬ: Вот решение, которое я выбрал, потому что RowState не уведомляет своих слушателей и расширение DataRow проблематично.

1) Привязать событие к элементам управления, когда их данные изменяются. 2) Обновите стиль, чтобы снова проверить RowState:

        Style s = ((TextBox)sender).Style;
        ((TextBox)sender).Style = null;
        ((TextBox)sender).Style = s;

Очевидно, это будет сделано более общим, чем это.

edit 2: Это явно не сработает, так как мне нужно будет сбросить стиль для каждого элемента управления в отдельности, что даже если бы это было возможно, было бы плохо делать

Ответы [ 3 ]

1 голос
/ 17 июня 2011

См. Следующее:

/3155095/wpftoolkit-datagrid-vydelenie-izmenennyh-strok

Что касается привязки, Row не является свойством DataGridRow, поэтому вы должны использовать DataContext.Row.RowState.

С учетом вышесказанного WPF не может обнаружить изменения в свойстве RowState, поэтому, вероятно, вам лучше всего заключить ваши элементы в модель представления, а не напрямую связываться с DataTable.

1 голос
/ 17 июня 2011

То, что вы хотите, это DataGridCell, который можно стилизовать.Из памяти свойства должны быть переданы в TextBox

0 голосов
/ 17 июня 2011

Попробуйте использовать селектор шаблонов данных. Создайте различные шаблоны данных, которые содержат нужные свойства в сочетании с текстовыми полями, и поменяйте их местами внутри вашей сетки данных. http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx

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