WPF: нужна помощь в добавлении UserControl в DataGrid с использованием DataGridTemplateColumn.CellTemplate. - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть WPF UserControl. Я хочу добавить этот пользовательский элемент управления в первый столбец каждой строки в DataGrid. Я использовал DataTemplate для достижения этой цели. Я добавляю новую строку, когда пользователь нажимает клавишу ВВОД в последней строке DataGrid. Organisation:OrganisationPicker - это пользовательский элемент управления ниже.

<DataGridTemplateColumn Width="250" Header="{x:Static resx:Resources.Organisation}" x:Name="OrgPickerColumn" CellStyle="{StaticResource SingleClickEditing}">                                
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
      <Grid >
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" Name="column1"></ColumnDefinition>
          <!--<ColumnDefinition Width="0.1*"></ColumnDefinition>-->
        </Grid.ColumnDefinitions>

        <Organisation:OrganisationPicker Width="240"
                                         HorizontalAlignment="Left" Margin="2,2,2,2"
                                         Name="orgPicker"
                                         VerticalAlignment="Top"
                                         Grid.Column="0"
                                         IsValidSearch="{Binding OrganisationError,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=true, NotifyOnValidationError=true,NotifyOnSourceUpdated=True}" 
                                         SelectedOrganisationalUnit="{Binding Path=ReqOrganisationId,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=true, NotifyOnValidationError=true,NotifyOnSourceUpdated=True}"
                                         Foreground="{DynamicResource ContentForeground}" FontFamily="{DynamicResource DefaultFontFamily}" FontSize="{DynamicResource NormalFontSize}">
        </Organisation:OrganisationPicker>                                           
      </Grid>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

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

например. Если добавляемая новая строка является 5-й строкой сетки, конструктор вызывается 5 раз!

Почему это происходит? Как я могу предотвратить это?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2011

Проблема заключалась в том, что модель представления была написана неправильно. Коллекция, привязанная к сетке, переинициализировалась при каждом добавлении новой строки. Поэтому я исправил модель представления, и она работала.

Спасибо всем за комментарии здесь.

Я закрываю этот вопрос, потому что решение было слишком локальным, и было невозможно определить проблему на онлайн-форуме.

0 голосов
/ 13 декабря 2011

Вы говорите, что теряете государство для своего контроля.

Я думаю, что вы должны хранить соответствующие данные для вашего элемента управления в модели представления за вашим пользовательским интерфейсом / элементом управления (для привязки и т. Д.).

Ваш элемент управления / столбец является только докладчиком для ваших данных.

Я не знаю, как именно работает сетка, но я думаю, что благодаря виртуализации в Grid ваш элемент управления будет генерироваться так же часто, как и элемент управления.

Надеюсь, это поможет.

...