Inquiridor
Advanced DataBinding WPF UserControls

Pergunta
-
Olá,
Tenho uma window WPF que possui um UserControl WPF e um grid que interagem entre si. Estou com um problema nessa interação com relação à um binding que é feito de uma coluna do grid com um checkbox interno à um usercontrol.
Abaixo o código do usercontrol incluindo a exposição da property para binding com elementos externos.
<UserControl x:Class="br.com.comporte.WPFUIComponentLibrary.CheckedGridResult" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:v="clr-namespace:br.com.comporte.WPFUIComponentLibrary" mc:Ignorable="d" d:DesignHeight="43" d:DesignWidth="130" <strong>x:Name="cmbSelection"</strong>> <UserControl.Resources> <v:Lista x:Key="opcoes"> <v:ListaItem Id="0" Item="Todos"/> <v:ListaItem Id="1" Item="Nenhum"/> </v:Lista> </UserControl.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition /> </Grid.ColumnDefinitions> <ComboBox x:Name="comboBox1" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{StaticResource ResourceKey=opcoes}" SelectionChanged="comboBox1_SelectionChanged"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock> <Button Click="Button_Click" Width="{Binding ElementName=comboBox1, Path=ActualWidth}"> <Button.Template> <ControlTemplate> <Grid> <TextBlock Text="{Binding Path=Item}"/> </Grid> <ControlTemplate.Triggers> </ControlTemplate.Triggers> </ControlTemplate> </Button.Template> </Button> </TextBlock> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> <CheckBox x:Name="checkBox1" Grid.Column="0" HorizontalAlignment="Left" Margin="12,1,0,0" VerticalAlignment="Center" <strong>IsChecked="{Binding ElementName=cmbSelection, Path=IsCheckedExternal}</strong>"/> <TextBlock Grid.Column="1" Text="Selecionar" Margin="12,1,0,0" HorizontalAlignment="Left" VerticalAlignment="Center"/> </Grid> </UserControl>
code behind do usercontrol:public partial class CheckedGridResult : UserControl { public static DependencyProperty isCheckedExternal; static CheckedGridResult() { isCheckedExternal = DependencyProperty.Register("IsCheckedExternal", typeof(bool), typeof(CheckedGridResult)); } <strong>public bool IsCheckedExternal { <span style="white-space:pre"> </span>get { return (bool)checkBox1.IsChecked; } <span style="white-space:pre"> </span>set { checkBox1.IsChecked = value; } } </strong> }
A tela apresenta o usercontrol citado acima e um datagrid logo abaixo do mesmo. Abaixo uma parte do código .xaml da tela:<Grid> <Grid.RowDefinitions> <RowDefinition Height="10*"/> <RowDefinition Height="75*"/> <RowDefinition Height="15*"/> </Grid.RowDefinitions><br/> <DataGrid Grid.Row="1" x:Name="dgResultado" FrozenColumnCount="1" AutoGenerateColumns="False"> <DataGrid.Columns> <strong><DataGridCheckBoxColumn Binding="{Binding Source=ckbSelecao, Path=IsCheckedExternal, Mode=TwoWay}"/></strong> <DataGridTextColumn Header="Id" Binding="{Binding Id}"/> <DataGridTextColumn Header="Nome" Binding="{Binding Nome}"/> </DataGrid.Columns> </DataGrid> <my:CheckedGridResult x:Name="ckbSelecao" HorizontalAlignment="Left" Margin="6,6,0,0" VerticalAlignment="Top" Width="107" Height="24"/> </Grid>
A intenção era fazer com que ao selecionar o checkbox na coluna do datagrid ele selecionaria o checkbox do usercontrol mas o mesmo não ocorre, tentei via código incluindo uma coluna e definindo o binding da coluna para o usercontrol - neste caso funcionou.code behind da coluna adicionada via código com binding para o usercontrol - neste caso funcionou, porém, ao selecionar o checkbox na coluna para uma row do datagrid ele seleciona todas as outras:
<span style="white-space:pre"> </span> Random rd = new Random(); for (int i = 0; i < 100; i++) { dados.Add( new Dado() { Id = rd.Next(0, 1000), Nome = NewMethod(rd, 20, 5), Data = new DateTime(rd.Next(2000, 2020), rd.Next(1, 12), rd.Next(1, 28)), Descricao = NewMethod(rd, 100, 10) }); } dgResultado.AutoGenerateColumns = true; <strong> DataGridCheckBoxColumn cColumn = new DataGridCheckBoxColumn(); Binding cBinding = new Binding(); cBinding.Source = ckbSelecao; cBinding.Path = new PropertyPath("IsCheckedExternal"); cBinding.Mode = BindingMode.TwoWay; cColumn.Binding = cBinding; dgResultado.Columns.Add(cColumn);</strong> dgResultado.ItemsSource = dados;
Se alguém conseguiu entender o que eu quero dizer e tiver algum modo de clarear as idéias, eu agradeço!