[英]How to change the visibility of a combobox in gridview
我想在gridview中更改组合框的可见性。 当值为空或为null时,需要隐藏组合框。 到目前为止这是我的代码。 gvCursisten是gridview。
编辑:这是在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);
这里的诀窍是使用行为 。 您创建一个继承自行为抽象类的自定义类。 当使用绑定在ComboBox上更改ItemsSource属性时,它将触发Behavior类的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属性的变量。
尝试这样的事情。 您可以使用FindControl循环遍历gridview的每一行并绑定数据或设置gridview中控件的可见性。
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;
}
}
}
只使用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>`
解决方案:我使用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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.