Как изменить видимость комбинированного списка в gridview - PullRequest
0 голосов
/ 23 января 2019

Я хочу изменить видимость поля со списком в виде сетки. Когда значение пусто или равно нулю, поле со списком необходимо скрыть. Это мой код до сих пор. gvCursisten - это сетка.

Редактировать: это работает в xaml, но не работает в 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);

Ответы [ 4 ]

0 голосов
/ 30 января 2019

Решение: я использовал System.Windows.Style для запуска нового стиля в комбинированном списке.

 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;
0 голосов
/ 23 января 2019

Попробуйте что-нибудь подобное.Вы можете циклически проходить по каждой строке вашего вида сетки и привязывать данные или устанавливать видимость для своих элементов управления в виде сетки с помощью 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;
        }
    }
}
0 голосов
/ 25 января 2019

Используйте только Value="{x:Null}" вместо 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>`
0 голосов
/ 23 января 2019

Хитрость здесь в том, чтобы использовать Поведение . Вы создаете пользовательский класс, который наследуется от абстрактного класса Behavior. Когда свойство ItemsSource изменяется в ComboBox с привязкой, оно вызывает метод OnAttached () вашего класса поведения.

Если вы используете 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>

или, если вы предпочитаете код позади:

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

Создать пользовательский класс: 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;                               
    }
}

Если скрытый ComboBox все еще имеет место на вашем макете, и вы не хотите его использовать, используйте вместо него Visibility.Collapsed

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

Это чистое решение и дружественный MVVM. Это позволяет избежать создания переменной, связанной со свойством ComboxBox Visibility.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...