如何管理放置在组合框的弹出部分中的DataGrid中的列可见性

时间:2013-02-21 15:13:43

标签: wpf xaml datatrigger

我的WPF页面上有一个单选按钮和一个组合框。 ComboBox是普通ComboBox的自定义版本,可以在下拉列表中显示多个列。我想要的只是显示或隐藏某个列,具体取决于单选按钮的IsChecked状态。我正在尝试使用DataTrigger来避免代码落后。

<RadioButton Content="Show ID Column" x:Name="chkScrollCustomerNumber" IsChecked="True" >

<m:MultiColumnComboBox x:Name="cboCustomer" IsSynchronizedWithCurrentItem="True" 
ItemsSource="{Binding AllCustomers}" SelectedValuePath="customerID"             DisplayMemberPath="customerID" SelectedValue="{Binding SalesOrder.customerID}">
    <DataGridTextColumn x:Name="colID" Binding="{Binding customerID, Mode=Default}" />
    <DataGridTextColumn Binding="{Binding customerName, Mode=Default}" />
    <DataGridTextColumn Binding="{Binding billingAddress, Mode=Default}"/>

    <m:MultiColumnComboBox.Style>
        <Style>
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=chk1, Path=IsChecked}" Value="True">
                    <Setter TargetName="colID" Property="Visibility" Value="Visible"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=chk1, Path=IsChecked}" Value="False">
                    <Setter TargetName="colID" Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </m:MultiColumnComboBox.Style>
</m:MultiColumnComboBox>

但它告诉我无法找到colID。

1 个答案:

答案 0 :(得分:1)

修改

好的,这是如何使这件事起作用的技巧:

  • 创建VisibilityToBooleanConverter:
public class VisibilityToBoolean : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (Visibility) value == Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool) value ? Visibility.Visible : Visibility.Collapsed;
    }
}   
  • 通过此转换器将RadioButton的IsChecked属性绑定到所需的列:
<RadioButton 
    IsChecked="{Binding ElementName=cboCustomer, 
             Path=Columns[0].Visibility, 
             Converter={StaticResource boolToVis}, 
             Mode=OneWayToSource}"
    ... />
  • 为每个RadioButton
  • 指定适当的列索引

(之前的所有建议都是错误的,因为DataGridTextColumn不是逻辑树的一部分,它没有DataContext属性,因此无需尝试将其属性绑定到任何地方)