none
Advanced DataBinding WPF UserControls RRS feed

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

     

     

     

    quarta-feira, 13 de julho de 2011 17:12