none
CheckBox y ComboBox Silverlight 4 RRS feed

  • Pregunta

  • Hola que tal.. necesito ayuda con silverlight.. recien estoy empezando.. nose si va aca la pregunta pero bueno.. tengo un datagrid con dos columnas, donde en la primera tengo un checkbox y en la segunda un combobox.

    Necesito que al tildar el checkbox se habilite el combobox y al destildar lo contrario... probe casi todo ya.. pero no puedo encontrar manera de obtener el objeto combobox para poder deshabilitarlo.. generalmente me tira un error "REFERENCIA A UN OBJETO NO ESTABLECIDA COMO INSTANCIA DE UN OBJETO" o algo asi je..

    Desde ya muchas graciass...

    Saludos

    lunes, 8 de agosto de 2011 13:33

Respuestas

  • ¡Hola!

     

    Creo que te ayudará revisar el apunte del blog de Yeraoy sobre árboles; http://jyeray.blogspot.com/2010/09/wpf-arboles.html

    Los métodos extensores estan en la entrada del foro: http://social.msdn.microsoft.com/Forums/es/wpfes/thread/8956494f-6fd0-4cb8-a567-82b22b9f7c4c

    En concreto Lunes 12 (C# David) y Martes 13 (VB.Net mia). Ello te permiten alcanzar cualquier control. Tal vez sea esto lo que necesitas ;-).

     

    Un saludo,

     

     

    • Marcado como respuesta gnc24 martes, 9 de agosto de 2011 12:41
    martes, 9 de agosto de 2011 6:45
  • Hola 

    Disculpa la demora, no lo he probado pero intenta de esta manera:

    DataGridColumn column = dataHorarios.Columns[1]; 
    FrameworkElement fe = column.GetCellContent(dataHorarios.SelectedItem);


    De esta forma fe tendrá la referencia del Combobox... espero te sirva porque estamos igual... ya sin cabello :P

     


    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    • Marcado como respuesta gnc24 martes, 9 de agosto de 2011 12:41
    lunes, 8 de agosto de 2011 23:11

Todas las respuestas

  • Por favor si alguien sabe algo o aunk sea una idea.. lo necesito para el trabajo me esatn apurando.. yo lo que intento hacer es de los eventos checked y uncheked del checkbox es tratar de bloquear o desbloquear el combobox.. pero el tema es que no puedo acceder al combo, no encuentro la forma o nose si habra otro evento que me deje hacer esto.

    XAML

    <Grid x:Name="LayoutRoot" Background="AliceBlue">
        
        <Grid.RowDefinitions >
          <RowDefinition Height="30"></RowDefinition>
          <RowDefinition Height="10"></RowDefinition>
          <RowDefinition Height="30"></RowDefinition>
          <RowDefinition Height="10*"></RowDefinition>
        </Grid.RowDefinitions>
        
        <Border Grid.RowSpan="4" BorderThickness="2" BorderBrush="DarkOliveGreen" CornerRadius="4" />
        
        <Border Grid.Row="0" CornerRadius="5" BorderThickness="2" Background="#DEDEDE"  BorderBrush="RoyalBlue">
          <TextBlock x:Name="lblTexto" Grid.Row="0" FontSize="24" FontWeight="Normal" FontFamily="Arial" TextAlignment="Right" Foreground="Black" VerticalAlignment="Center" HorizontalAlignment="Center" Width="160" Height="30" RenderTransformOrigin="0.5,0.5" >
          </TextBlock>
        </Border>
    
        <Border Grid.Row="1" Grid.RowSpan="3" CornerRadius="5" BorderThickness="2" Background="White" BorderBrush="RoyalBlue">
          
         <sdk:DataGrid x:Name="dataHorarios" AutoGenerateColumns="False" LoadingRow="dataHorarios_LoadingRow"
          SelectionChanged="dataHorarios_SelectionChanged" CurrentCellChanged="dataHorarios_CurrentCellChanged" ItemsSource="{Binding}">
          <sdk:DataGrid.Columns>
          <!--<sdk:DataGridCheckBoxColumn 
              Width="27" 
              x:Name="chboxHorarios" 
              IsReadOnly="False"
              Binding="{Binding isValorPorDefecto, Mode=TwoWay}">
            </sdk:DataGridCheckBoxColumn>-->
            
            <sdk:DataGridTemplateColumn Header="elegir" Width="20">
              <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <StackPanel>
                   <CheckBox
                     x:Name="checkTipoTarjeta" 
                     Checked="checkTipoTarjeta_Checked"
                     Unchecked="checkTipoTarjeta_Unchecked">
                   </CheckBox>
                  </StackPanel>
                </DataTemplate>
              </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>
            <sdk:DataGridTemplateColumn Header="horarios" Width="130">
              <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <StackPanel>
                    <ComboBox Name="cmbHorarios" Width="127" SelectionChanged="cmbHorarios_SelectionChanged">
                      <ComboBox.ItemTemplate>
                        <DataTemplate>
                          <StackPanel Orientation="Horizontal">
                            <TextBlock x:Name="txtHorarios" Text="{Binding descripcion}" />
                          </StackPanel>
                        </DataTemplate>
                      </ComboBox.ItemTemplate>
                    </ComboBox>
                  </StackPanel>
                </DataTemplate>
              </sdk:DataGridTemplateColumn.CellTemplate>
            </sdk:DataGridTemplateColumn>
          </sdk:DataGrid.Columns>
         </sdk:DataGrid>
        </Border>
      </Grid>
    


    y los eventos que tengo...

    private void checkTipoTarjeta_Checked(object sender, RoutedEventArgs e)
     {
      int ver = this.dataHorarios.SelectedIndex;
      var ver2 = this.dataHorarios.SelectedItem;
    
      CheckBox check = new CheckBox();
      ComboBox combo = new ComboBox();
          
      check = sender as CheckBox;
      combo = sender as ComboBox;
    
      check = (CheckBox)dataHorarios.Columns[0].GetCellContent(ver).FindName("checkTipoTarjeta");
      combo = (ComboBox)dataHorarios.Columns[1].GetCellContent(ver).FindName("cmbHorarios");
    
      if (check.IsChecked == true)
      {
        combo.IsEnabled = true;
      }
      else 
      {
        combo.IsEnabled = true;
      }
    }
    

    Me tira un error en

    combo = (ComboBox)dataHorarios.Columns[1].GetCellContent(ver).FindName("cmbHorarios");
    

    El error es "Referencia a objeto no establecida como instancia de un objeto." es pork combo = sender as combobox me devuelve nulo.

    No consigo tomar ese combobox para darle un valor IsEnabled=true o false...

    Muchas gracias...

    • Propuesto como respuesta Antonio Lobo lunes, 8 de agosto de 2011 16:03
    • Votado como útil Antonio Lobo lunes, 8 de agosto de 2011 16:03
    lunes, 8 de agosto de 2011 15:46
  • Hola

    Siempre me voy por la respuesta más fácil... estas usando un modelo para cargar tu DataGrid, por que no usas una variable mas que se llame Checked la cual va a tener el Bind del checkbox de esta manera:

    <CheckBox x:Name="checkTipoTarjeta" IsChecked="{Binding Checked}"/>

    Y tu Combobox tendría el bind de esta manera 

    <ComboBox Name="cmbHorarios" Width="127" IsEnabled="{Binding Checked}" SelectionChanged="cmbHorarios_SelectionChanged">

    Así cuando tu checkbox se marque o desmarque el combobox se habilitará o deshabilitará

    Que te parece esa solución? Es adecuada o necesitas de otra forma?


    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    • Propuesto como respuesta CorsarioVasco lunes, 8 de agosto de 2011 16:32
    lunes, 8 de agosto de 2011 16:09
  • Me parece muy buena la idea.. pero no alcanzo a entender el tema de la variable.. o sea donde la declaro o que valores ponerle.. gracias por responderme..
    lunes, 8 de agosto de 2011 17:04
  • Hola otra vez :)

    Ahora revisando tu código en gran detalle, veo que no estas usando un modelo/entidad para cargar tu datagrid, tu solo estas agregando información al combobox haciendo un Binding.

    Ahora con tu código:

    combo = sender as ComboBox; En esta parte del código el sender es un Checkbox por eso es que te devuelve null

    Mira si te sirve con esto:

    DataGridRow row = dataHorarios.ItemContainerGenerator.ContainerFromIndex(dataHorarios.SelectedIndex);
    Combobox combo = dataHorarios.Columns[1].GetCellContent(row) as Combobox;
    Checkbox check = sender as Checkbox;
    if (combo != null)
      combo.IsEnabled = check.Checked;
    



    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    lunes, 8 de agosto de 2011 17:47
  • gracias por responder tan rapido antonio.. puse el codigo en el evento checkTipoDeTarjeta_Checked pero me tira dos errores uno en

    ItemContainerGenerator, que el error es:

    "System.Windows.Controls.DataGrid' does not contain a definition for 'ItemContainerGenerator' and no extension method 'ItemContainerGenerator' accepting a first argument of type 'System.Windows.Controls.DataGrid' could be found (are you missing a using directive or an assembly reference?)"

    Y en combo.IsEnabled=check.Checked:

    "The event 'System.Windows.Controls.Primitives.ToggleButton.Checked' can only appear on the left hand side of += or -="

     

    Realmente no puedo bloquear ese combo!! me estoy quedando sin pelos ya!! ja

    lunes, 8 de agosto de 2011 18:04
  • Acabo de probar con este codigo...

    int indexData = this.dataHorarios.SelectedIndex;
    
    ComboBox combo = dataHorarios.Columns[1].GetCellContent(indexData) as ComboBox;
    CheckBox checkOn = sender as CheckBox;
    if (combo != null)
    {
      //combo.IsEnabled = checkOn.Checked;
    }
    
    
    
    pero sigue devolviendome null en el combo.. es tan complicado acceder a un control desde un evento ajeno??
    lunes, 8 de agosto de 2011 18:16
  • Hola 

    Disculpa la demora, no lo he probado pero intenta de esta manera:

    DataGridColumn column = dataHorarios.Columns[1]; 
    FrameworkElement fe = column.GetCellContent(dataHorarios.SelectedItem);


    De esta forma fe tendrá la referencia del Combobox... espero te sirva porque estamos igual... ya sin cabello :P

     


    Antonio Lobo
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi blog
    • Marcado como respuesta gnc24 martes, 9 de agosto de 2011 12:41
    lunes, 8 de agosto de 2011 23:11
  • ¡Hola!

     

    Creo que te ayudará revisar el apunte del blog de Yeraoy sobre árboles; http://jyeray.blogspot.com/2010/09/wpf-arboles.html

    Los métodos extensores estan en la entrada del foro: http://social.msdn.microsoft.com/Forums/es/wpfes/thread/8956494f-6fd0-4cb8-a567-82b22b9f7c4c

    En concreto Lunes 12 (C# David) y Martes 13 (VB.Net mia). Ello te permiten alcanzar cualquier control. Tal vez sea esto lo que necesitas ;-).

     

    Un saludo,

     

     

    • Marcado como respuesta gnc24 martes, 9 de agosto de 2011 12:41
    martes, 9 de agosto de 2011 6:45
  • me anduvo perfecto antonio no lo puedo creer todavia.. sabes lo que renegue con esoo.. muchas graciass.. te agradezco mucho la ayudaa..

    mucha suerte.. saludos..

    martes, 9 de agosto de 2011 12:39
  • hola corsario.. gracias me sirvio mucho la informacion que me pasaste.. era un tema pendiente que tenia con eso de acceder entre objetos.. te agradezo la ayuda.. mucha suerte.. saludos...
    martes, 9 de agosto de 2011 12:40