3 votes

Comment modifier la visibilité d'une combobox dans un gridview ?

Je veux changer la visibilité d'une combobox dans un gridview. Lorsque la valeur est vide ou nulle, la combobox doit être cachée. Voici mon code jusqu'à présent. gvCursisten est le gridview.

Edit : Cela fonctionne dans xaml, mais pas dans cs.

  <ListView Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Grid.RowSpan="2" Name="lvTest">
                <ListView.View>
                    <GridView x:Name="gvCursisten">
                        <GridViewColumn Header="Property" Width="160">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <ComboBox x:Name="PropertyComboBox" ItemsSource="{Binding Path=Voornaam}" Width="140" >
                                        <ComboBox.Style>
                                            <Style TargetType="ComboBox">
                                                <Setter Property="Visibility" Value="Visible"/>
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding ElementName=txtTest, Path=Text}" Value="Hoi">
                                                        <Setter Property="Visibility" Value="Hidden"/>
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </ComboBox.Style>
                                    </ComboBox>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>

C# code
GridViewColumn gvcCombobox2 = new GridViewColumn();
gvcCombobox2.Header = "Combobox2";
gvcCombobox2.Width = 200;

DataTemplate dteCombobox2 = new DataTemplate();

Style styleComboBox2 = new Style(typeof(ComboBox));
Setter setterStyleComboBox2 = new Setter();
setterStyleComboBox2.Property = ComboBox.VisibilityProperty;
setterStyleComboBox2.Value = Visibility.Visible;
styleComboBox2.Setters.Add(setterStyleComboBox2);

DataTrigger datatriggerStyleComboBox2 = new DataTrigger();
datatriggerStyleComboBox2.Value = "Hello";
Binding bindingDatatriggerStyleComboBox2 = new Binding("{Binding ControlType}");
datatriggerStyleComboBox2.Binding = bindingDatatriggerStyleComboBox2;

Setter setterDatatriggerStyleComboBox2 = new Setter();
setterDatatriggerStyleComboBox2.Property = ComboBox.VisibilityProperty;
setterDatatriggerStyleComboBox2.Value = Visibility.Hidden;
datatriggerStyleComboBox2.Setters.Add(setterDatatriggerStyleComboBox2);

styleComboBox2.Triggers.Add(datatriggerStyleComboBox2);

FrameworkElementFactory fefCombobox2 = new FrameworkElementFactory(typeof(ComboBox));
fefCombobox2.SetValue(ComboBox.WidthProperty, 140D);
fefCombobox2.SetValue(ComboBox.ItemsSourceProperty, dtTest.DefaultView);
fefCombobox2.SetValue(ComboBox.StyleProperty, styleComboBox2);

dteCombobox2.VisualTree = fefCombobox2;
gvcCombobox2.CellTemplate = dteCombobox2;
gvCursisten.Columns.Add(gvcCombobox2);

0voto

Dairon Points 139

L'astuce ici est d'utiliser Comportement . Vous créez une classe personnalisée qui hérite de la classe abstraite Behavior. Lorsque la propriété ItemsSource est modifiée sur la ComboBox avec liaison, elle déclenche la méthode OnAttached() de votre classe Behavior.

Si vous utilisez xaml :

<Window //Your window property here
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">

<ComboBox x:Name="PropertyComboBox" ItemsSource="{Binding Path=Voornaam}" Width="140" >
    <i:Interaction.Behaviors>
        <local:HideComboxBehavior/>
    </i:Interaction.Behaviors>
</ComboBox>

ou si vous préférez le code derrière :

using System.Windows.Interactivity;
[...]
Interaction.GetBehaviors(myCombobox).Add(new HideComboxBehavior());

Créez une classe personnalisée : HideComboxBehavior.cs

using System.Windows.Controls;
using System.Windows.Interactivity;

[...]

public class HideComboxBehavior : Behavior<ComboBox>
{
    protected override void OnAttached()
    {
        if (AssociatedObject.Items == null || AssociatedObject.Items == 0)
            AssociatedObject.Visibility = System.Windows.Visibility.Hidden;                               
    }
}

Si la ComboBox cachée est toujours présente dans votre mise en page et que vous ne la voulez pas, utilisez plutôt Visibility.Collapsed.

AssociatedObject.Visibility = System.Windows.Visibility.Collapsed;

Il s'agit d'une solution propre et adaptée à MVVM. Elle évite de créer une variable liée à la propriété ComboxBox Visibility.

0voto

Shreyas Pednekar Points 466

Essayez quelque chose comme ça. Vous pouvez parcourir en boucle chaque ligne de votre grille et lier des données ou définir la visibilité de vos contrôles dans la grille à l'aide de FindControl.

protected void gvCursisten_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
        ComboBox cb = (e.Row.FindControl("gvcomboboxid") as ComboBox);
        if(some_value == null)
        {
            cb.Visible = false;
        }
        else
        {
            cb.Visible = true;
        }
    }
}

0voto

N'utilisez que Value="{x:Null}" au lieu de Value="Hoi"

`<ComboBox x:Name="PropertyComboBox" ItemsSource="{Binding Path=Voornaam}" Width="140" 
  >
            <ComboBox.Style>
                 <Style TargetType="ComboBox">
                   <Setter Property="Visibility" Value="Visible"/>
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding 
  ElementName=txtTest, Path=Text}" Value="{x:Null}">
                                             <Setter Property="Visibility" 
   Value="Hidden"/>
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </ComboBox.Style>
         </ComboBox>`

0voto

nielsmartens Points 39

Solution : J'ai utilisé System.Windows.Style pour déclencher un nouveau style pour la combobox.

 Style cbStyle = new Style(typeof(ComboBox));
                    Setter cbSetter = new Setter(ComboBox.VisibilityProperty, Visibility.Visible);                  
                    cbStyle.Setters.Add(cbSetter);

                    DataTrigger cbDataTrigger = new DataTrigger();
                    Binding cbBinding = new Binding(column.ColumnName);

                    cbDataTrigger.Value = 0;

                    Setter cbDataSetter = new Setter(ComboBox.VisibilityProperty, Visibility.Hidden);

                    cbDataTrigger.Setters.Add(cbDataSetter);
                    cbDataTrigger.Binding = cbBinding;
                    cbStyle.Triggers.Add(cbDataTrigger);               

                    fElement.SetValue(ComboBox.StyleProperty, cbStyle);

                    DataTemplate dataTemplate = new DataTemplate();
                    dataTemplate.VisualTree = fElement;
                    gvc.CellTemplate = dataTemplate;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X