Silverlight: проблема с использованием CellEditingTemplate - PullRequest
2 голосов
/ 10 августа 2009

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

Я связываюсь с сущностью кодового поколения через Службы RIA. Я добавил обработчик события в событие PropertyChanged, и он никогда не запускается. Однако, если я не использую шаблон и вместо этого использую DataGridTextColumn, все работает нормально.

Я уверен, что это звучит как простое исправление - я использую только TextBox в своем шаблоне редактирования, так почему бы не использовать DataGridTextColumn? Проблема в том, что я хочу иметь многострочное текстовое поле, поэтому использование DataGridTextColumn не вариант.

Есть предложения? Известны ли вам какие-либо различия между использованием CellEditingTemplate, содержащего один TextBox, и использованием DataGridTextColumn?

Спасибо
-Charles

[UPDATE]
Я опубликовал сообщение об ошибке здесь:
http://silverlight.net/forums/p/118729/267521.aspx

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

Ответы [ 2 ]

0 голосов
/ 18 августа 2009

i " suspect " проблема заключается в конструкторах по умолчанию для свойства Text текстового поля.

Теперь свойство Text является свойством зависимости, когда вы вызываете

 <TextBlock Text="{Binding Text}" ></TextBlock>

вы фактически вызываете конструктор для свойства Text, которое принимает одно строковое значение, в свою очередь SL / WPF использует отражение, чтобы выяснить, какой это конструктор, вы можете избежать этого, используя его в стиле именованных параметров.

 <TextBlock Text="{Binding Path=Text}" ></TextBlock>

Я думаю, что не указывать режим, в котором по умолчанию используется одноразовая привязка, поэтому OnPropertyChanged не влияет на значение, поскольку привязка происходит только один раз. который выглядит как ниже. Теперь для привязки текстового поля по умолчанию используется значение «OneWay», возможно, поскольку оно вложено в сетку данных, его поведение по умолчанию отличается. Возможно, он выполняет функцию наследования свойств и использует режим привязки элемента управления пользовательского интерфейса под ним.

<TextBlock Text="{Binding Text, Mode=OneTime}" ></TextBlock>

следовательно, почему, когда вы указываете режим привязки, вот так

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock>

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

0 голосов
/ 11 августа 2009

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

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

<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>


Обратите внимание, как я указал «Mode = OneWay» в привязке TextBlock:

<TextBlock Text="{Binding Text, Mode=OneWay}" ></TextBlock>


Я понятия не имею, почему это должно иметь значение. Даже если для TextBlock было установлено значение TwoWay, почему бы не внести никаких изменений в объект, связанный с данными?

Объяснение будет с благодарностью ... Я потратил около пяти часов, стуча головой о клавиатуру, чтобы добраться до этой точки, и я хотел бы знать, почему я совершил эту ошибку при условии, что это не ошибка в Silverlight).

Спасибо
-Charles

...