Pergunta

Eu tenho um datagrid com uma coluna que contém uma caixa de seleção. Eu quero mudar o valor da propriedade selecionada ligada quando a linha é clicado:

alt texto http://lh4.ggpht.com/_L9TmtwXFtew/Sw6YtzRWGEI /AAAAAAAAGlQ/pntIr2GU6Mo/image_thumb%5B3%5D.png

NOTA:. Eu não quero usar o evento SelectedItemChanged porque isso não funciona corretamente quando há apenas uma linha na grade

Foi útil?

Solução

Como é frequentemente a maneira que eu encontrei a minha própria solução para isso:

Adicionar um evento MouseLeftButtonUp ao datagrid:

<data:DataGrid x:Name="dgTaskLinks"
ItemsSource="{Binding TaskLinks}"
SelectedItem="{Binding SelectedTaskLink, Mode=TwoWay}"
MouseLeftButtonUp="dgTaskLinks_MouseLeftButtonUp"
>...

E percorrer a árvore visual para obter a linha de grade de dados:

private void dgTaskLinks_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
            {
                ///get the clicked row
                DataGridRow row = MyDependencyObjectHelper.FindParentOfType<DataGridRow>(e.OriginalSource as DependencyObject);

                ///get the data object of the row
                if (row != null && row.DataContext is TaskLink) 
                {
                    ///toggle the IsSelected value
                    (row.DataContext as TaskLink).IsSelected = !(row.DataContext as TaskLink).IsSelected;
                }

            }

Uma vez encontrado, é uma abordagem simples para alternar o IsSelected propriedade ligados: -)

Espero que isso ajude alguém.

Outras dicas

Aqui é uma solução ainda mais simples

XAML

<data:DataGrid 
x:Name="dgMyDataGrid" 
ItemsSource="{Binding MyList}"
SelectedItem="{Binding MyList, Mode=TwoWay}"
 MouseLeftButtonUp="dgMyDataGrid_MouseLeftButtonUp">...

CS

private void dgMyDataGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    DataGrid dg = (sender as DataGrid);
    var allObjects = dg.DataContext as List<MyCustomObject>;
    foreach(var o in allObjects)
    {
          o.Selected = false;
    }

    MyCustomObject SelectedObject = (MyCustomObject)dg.SelectedItem;
    SelectedObject.Selected = true;
}

Nota: este, bem como outro exemplo assume sua classe que você está ligando para os implementos controle INotifyPropertyChanged

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top