Silverlight: проблема с использованием CellEditingTemplate

2

У меня возникает проблема с 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

Я не могу себе представить, что это "спроектировано"... Если кто-то знает об этом, и я просто тупой, я буду благодарен за объяснение - я бы предпочел смущение по незнанию:).

  • 0
    +1: у меня были те же проблемы.
  • 0
    Пожалуйста, дайте мне знать, если вы найдете решение. Это начинает сводить меня с ума. Я обязательно обновлю это, если найду решение.
Показать ещё 1 комментарий
Теги:
silverlight
silverlight-3.0

2 ответа

0
Лучший ответ

Я нашел решение, но не могу объяснить, почему это имеет значение:

Измените это...

<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

  • 0
    Судя по поведению, которое вы видите, я бы сказал, что узлы XML обрабатываются по порядку, а сигнатура ctor определяется один раз и кэшируется.
0

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>

он работает счастливо и легко

Ещё вопросы

Сообщество Overcoder
Наверх
Меню