У меня возникает проблема с DataGrid, где мои свойства объектов, привязанных к данным, не обновляются при использовании CellTemplate/CellEditingTemplate:
<data:DataGridTemplateColumn Header="Text">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" ></TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Text, Mode=TwoWay}" />
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>
Я привязываюсь к объекту code-gen'd через службы RIA. Я добавил обработчик события в событие PropertyChanged, и он никогда не запускается. Однако, если я не использую шаблон и вместо этого использую DataGridTextColumn, все работает нормально.
Я уверен, что это звучит как легкое исправление. Я использую TextBox в своем шаблоне редактирования, так почему же мы не DataGridTextColumn? Проблема в том, что я хочу иметь многострочное текстовое поле, поэтому использование DataGridTextColumn не является вариантом.
Любые предложения? Знаете ли вы какие-либо различия между использованием CellEditingTemplate, содержащего один TextBox, и использованием DataGridTextColumn?
Спасибо,
-Charles
[UPDATE]
Я отправил сообщение об ошибке здесь:
http://silverlight.net/forums/p/118729/267521.aspx
Я не могу себе представить, что это "спроектировано"... Если кто-то знает об этом, и я просто тупой, я буду благодарен за объяснение - я бы предпочел смущение по незнанию:).
Я нашел решение, но не могу объяснить, почему это имеет значение:
Измените это...
<data:DataGridTemplateColumn Header="Text">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}" ></TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Text, Mode=TwoWay}" />
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>
... к этому:
<data:DataGridTemplateColumn Header="Text">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Text, Mode=TwoWay}" />
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>
Обратите внимание, как я указал "Режим = OneWay" на привязке TextBlock:
<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock>
Я понятия не имею, почему это должно иметь значение. Даже если TextBlock был установлен в TwoWay, почему бы не внести какие-либо изменения в объект, привязанный к данным?
Было бы очень полезно объяснение... Я потратил около пяти часов, ударяя головой о клавиатуру, чтобы добраться до этого момента, и я хотел бы знать, почему я допустил эту ошибку ( предполагая, что это не ошибка в Silverlight).
Спасибо,
-Charles
i " подозреваемый" проблема заключается в конструкторах по умолчанию для свойства Text текстового поля.
Теперь свойство Text является зависимым свойством, когда вы вызываете
<TextBlock Text="{Binding Text}" ></TextBlock>
вы на самом деле вызываете конструктор для свойства Text, который принимает одно строковое значение, в свою очередь, SL/WPF использует отражение, чтобы выяснить, какой конструктор он использует, вы можете избежать этого, используя его в стиле именованных параметров.
<TextBlock Text="{Binding Path=Text}" ></TextBlock>
Я думаю, что не укажу режим, который он по умолчанию использует для привязки к одному времени, поэтому OnPropertyChanged не влияет на значение, поскольку привязка происходит только один раз. который выглядит как ниже. Теперь по умолчанию для привязки текстового поля является "OneWay", возможно, с момента его вставки в datagrid, его поведение по умолчанию отличается. Возможно, он делает свойство наследования свойств и использует режим привязки элемента управления UI под ним.
<TextBlock Text="{Binding Text, Mode=OneTime}" ></TextBlock>
поэтому почему, когда вы указываете режим привязки так:
<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock>
он работает счастливо и легко