Являются ли события Silverlight DataGrid Checkbox событиями? - PullRequest
2 голосов
/ 14 февраля 2009

Возможно ли, чтобы привязанный DataGridCheckBoxColumn вызывал метод click? Или событие уровня строки или событие ввода строки?

Я пытаюсь реализовать сетку данных, которая обновляет базовую отфильтрованную коллекцию ObservableCollection (отличный пример здесь http://petermcg.wordpress.com/2009/01/29/filtering-silverlight-datagrid-rows/)

Фильтрация работает нормально, если я нажимаю кнопку обновления или другой внешний метод. Но я не могу найти какое-либо внутреннее событие сетки или что-либо еще в DataGridCheckBoxColumn, которое позволило бы мне вызывать логику фильтра обновлений.

Любые предложения о том, как реализовать сетку данных, которая обновляет базовую коллекцию при нажатии флажка?

Пожалуйста, найдите ниже моего Xaml, это действительно ничего особенного.



1 Ответ

11 голосов
/ 14 февраля 2009

Тип DataGridCheckBoxColumn в настоящее время не предоставляет событие Click, фактически оно не предоставляет никаких событий. Ячейка, отображаемая в столбце этого типа, просто реализует привязку TwoWay между свойством IsChecked элемента управления CheckBox и свойством (указанным в привязке) в экземпляре T в текущей строке ObservableCollection , которой является DataGrid привязан к.

Вы не предоставляете свой Xaml, поэтому я буду использовать пример из своего поста в блоге, на который есть ссылка в вашем вопросе. Обходное решение включает в себя указание DataGridTemplateColumn , содержащего CheckBox, и определение события Click следующим образом:

<data:DataGrid x:Name="FilteredPeople" AutoGenerateColumns="False">
  <data:DataGrid.Columns>
    <data:DataGridTextColumn Header="First Name" Binding="{Binding FirstName}" />
    <data:DataGridTextColumn Header="Age" Binding="{Binding Age}" />
    <data:DataGridCheckBoxColumn Header="Visible" Binding="{Binding IsVisible}" />

    <data:DataGridTemplateColumn Header="Row Filter">
      <data:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
          <CheckBox x:Name="RowFilterButton" IsChecked="{Binding IsVisible}"
                Content="Filter" Tag="{Binding}" Click="RowFilterButton_Click" />
        </DataTemplate>
      </data:DataGridTemplateColumn.CellTemplate>
    </data:DataGridTemplateColumn>

  </data:DataGrid.Columns>
</data:DataGrid>

Альтернативой CheckBox в этом случае может быть ToggleButton или обычный элемент управления Button. Обратите внимание на привязку для свойства Tag CheckBox. Это помогает выяснить, в какой строке был выбран CheckBox из выделенного кода:

private void RowFilterButton_Click(object sender, RoutedEventArgs e)
{
    Person person = ((CheckBox)sender).Tag as Person;
}

Затем вы можете удалить этого человека из ObservableCollection или изменить его свойства для фильтрации или обновления DataGrid в зависимости от ситуации.

Обычно этот ответ заканчивается, но если у вас не установлено это обновление установлено в стандартной версии SDK Silverlight 2 DataGrid есть ошибка , которая предотвращает это. В этом случае ошибка будет проявляться в том, что DataGrid не рисует строку, в которой находится CheckBox (вместо того, что вы получаете, выглядит как невидимая строка), если вы заставляете DataGrid фильтроваться при щелчке по этому CheckBox (то есть у флажка есть фокус) .

Чтобы избежать этой ошибки, установите обновление или инициируйте любые манипуляции с ObservableCollection , к которому DataGrid привязан из элемента управления вне строк DataGrid , как в этом примере .

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