none
Hacer un boton del datagrid invisible segun otra columna RRS feed

  • Pregunta

  • Buenas, vengo de nuevo con una pregunta sobre el Datagrid que me esta costando resolver.

    Tengo el siguiente DataGrid en el que se ha incluido una columna que contiene un boton, el caso es que este boton deberia de tener las propiedades IsEnabled y Visibility a false si en la columna anterior "Incluido" esta a false, ¿ Alguna idea de como hacer esto ?

    <DataGrid x:Name="Venta_Articulos_G" IsEnabled="False"
                      AutoGenerateColumns="False" GridLinesVisibility="None"
                      Width="684" Height="278" Grid.Row="3" Grid.RowSpan="7" Margin="70,35,0,0"
                      HorizontalAlignment="Left" VerticalAlignment="Top" 
                      MouseDoubleClick="MostrarArticulo" CellEditEnding="ModificarColumna">
                <DataGrid.Columns>
                    <DataGridTextColumn IsReadOnly="True" Header="Id"     Binding="{Binding Path=ArticuloId}" Visibility="Hidden"></DataGridTextColumn>
                    <DataGridTextColumn IsReadOnly="True" Header="Codigo" Binding="{Binding Path=Codigo}" Visibility="Hidden"></DataGridTextColumn>
                    <DataGridTextColumn IsReadOnly="True" Header="Clase"  Binding="{Binding Path=Clase.Nombre}" MinWidth="50"></DataGridTextColumn>
                    <DataGridTextColumn IsReadOnly="True" Header="Modelo" Binding="{Binding Path=Modelo.Nombre}" MinWidth="50"></DataGridTextColumn>
                    <DataGridTextColumn IsReadOnly="True" Header="Talla"  Binding="{Binding Path=Talla}" MinWidth="50"></DataGridTextColumn>
    
                    <DataGridTemplateColumn Header="Modos" MinWidth="150">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Width="138" Text="{Binding Modo.Nombre}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
    
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <ComboBox Width="148" Height="21" Loaded="CargarModos" SelectionChanged="ModificarModo" SelectedItem="{Binding Modo.Nombre}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
    
                    </DataGridTemplateColumn> 
    
                    <DataGridTextColumn IsReadOnly="True" Header="Precio" Binding="{Binding Precio, StringFormat='{}{0:c}'}" MinWidth="75"></DataGridTextColumn>
                    <DataGridTextColumn Header="Descuento" Binding="{Binding Descuento, StringFormat='{}{0}%'}" MinWidth="75"></DataGridTextColumn>
                    <DataGridTextColumn IsReadOnly="True" Header="Total" Binding="{Binding Total, StringFormat='{}{0:c}'}" MinWidth="75"></DataGridTextColumn>
                    <DataGridTextColumn Header="Signal" Binding="{Binding Signal, StringFormat='{}{0:c}'}" MinWidth="75"></DataGridTextColumn>
                    <DataGridTextColumn Header="Incluido" Binding="{Binding Incluido }" MinWidth="75"></DataGridTextColumn>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button x:Name="BT_Taller" Click="CrearTaller" Tag="{Binding Path=ArticuloId}" Style="{StaticResource BotonSimple}" >Taller</Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>

    Por otra parte y como segunda parte de una cuestion del DataGrid, algunas de las columnas son editables y se pueden modificar la cuestion es ¿ Como puedo dejar el texto de la columna seleccionado cuando se va a editar ? para que no se escriba ni por delante ni por detras sino que se quede seleccionado como si lo hubiera seleccionado con el raton.

    Gracias por su ayuda

    Saludos

    viernes, 6 de febrero de 2015 14:03

Respuestas

  • Jeje, las cosas de la vida.  Nunca es el caso sencillo. :-P

    Tiene dos opciones:

    1. Si sigue el modelo MVVM, simplemente agregue una nueva propiedad al VM llamada NoIncluido cuyo get sería return !Incluido; y luego haga el binding a esta nueva propiedad.
    2. Cree su propio Boolean to Visibility converter que trabaje opuesto al provisto por .Net.  Es bien fácil.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta Veleras viernes, 6 de febrero de 2015 23:59
    viernes, 6 de febrero de 2015 22:54

Todas las respuestas

  • Cambiar tanto IsEnabled como Visibility es redundante, pues si el botón no está visible no es posible accionarlo aún cuando esté habilitado.

    <!-- Esto va en un ResourceDictionary, usualmente en App.xaml -->
    <BooleanToVisibilityConverter x:Key="BoolToVis" />
    
    
    <!-- Así quedaría el botón -->
    <Button x:Name="BT_Taller" Click="CrearTaller" Tag="{Binding Path=ArticuloId}" Style="{StaticResource BotonSimple}"
        Visibility="{Binding Path=Incluido, Converter={StaticResource BoolToVis}}" >Taller</Button>


    Jose R. MCP
    Code Samples


    • Editado webJose viernes, 6 de febrero de 2015 14:55
    viernes, 6 de febrero de 2015 14:54
  • Me parece una buena idea y muy fácil de implementar y funcionaria, pero el caso es que Incluido = true y es cuando no debería verse el botón y claro me lo hace al revés,  ¿ puede hacerse algo solo para cambiar esto ? en el resource o en el botón ?

    Y con respecto a la segunda parte de la pregunta ¿ alguna idea para marcar por defecto el texto de las celdas evitables ?

    viernes, 6 de febrero de 2015 21:19
  • Jeje, las cosas de la vida.  Nunca es el caso sencillo. :-P

    Tiene dos opciones:

    1. Si sigue el modelo MVVM, simplemente agregue una nueva propiedad al VM llamada NoIncluido cuyo get sería return !Incluido; y luego haga el binding a esta nueva propiedad.
    2. Cree su propio Boolean to Visibility converter que trabaje opuesto al provisto por .Net.  Es bien fácil.

    Jose R. MCP
    Code Samples

    • Marcado como respuesta Veleras viernes, 6 de febrero de 2015 23:59
    viernes, 6 de febrero de 2015 22:54