ItemsControl

时间:2015-06-10 14:32:28

标签: c# wpf itemscontrol datatrigger

我有一个ItemsControl,显示标签列表&用于数据输入的TextBox和按下时使用输入值执行某些命令的按钮:

<DataTemplate x:Key="StringParameterTemplate">
    <StackPanel Name="StackPanel_Parameter"
                Orientation="Horizontal">
        <Label Name="ParameterLabel"
               Content="{Binding ParameterLabel}"
               HorizontalContentAlignment="Right"
               Width="200" />
        <TextBox Name="ParameterTextBlock"
                 Text="{Binding ParameterValue, UpdateSourceTrigger=PropertyChanged}"
                 Width="300"/>
    </StackPanel>
</DataTemplate>

        . . .

        <!-- Display all parameters -->
        <ItemsControl Name="ListView_Parameters"
                      ItemsSource="{Binding ParameterCollection, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
                      ItemTemplateSelector="{StaticResource TaskParameterTemplateSelector}"
                      BorderThickness="0" />

<Button Name="ExecuteTaskButton"
        Content="{Binding ButtonLabel}"
        Style="{StaticResource ExecuteButtonStyle}"
        Command="ExecuteTask">

我想创建一个样式,当ListView_Parameters中的任何参数为空时启用/禁用按钮。像这样:

<!-- Execute button enable / disable -->
<Style x:Key="ExecuteButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="Button.IsEnabled" Value="True" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=ListView_Parameters, Path=ParameterValue}" Value="">
            <Setter Property="IsEnabled" Value="False" />
        </DataTrigger>    
    </Style.Triggers>
</Style>

1 个答案:

答案 0 :(得分:0)

您可以使用转换器通过单个绑定实现此目的。

<Button Content="{Binding ButtonLabel}"
        IsEnabled="{Binding Path=ItemsSource, 
                            RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}, 
                            Converter={local:ItemsToBooleanConverter}}" />

然后你的转换器接受itemssource的输入(例如对象列表) - 如果你想要的所有字段都有值,则返回true,否则返回false。

转换器主要是样板,但看起来像这样:

public class ItemsToBooleanConverter : MarkupExtension, IValueConverter

...但重要的部分是这样的,如果您使用的是列表:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var items = value as IList<ParameterList>;
        return !(items.Any( <you check here for empty values> );
    }

您需要确保参数输入字段正确绑定到其源,以便转换器检查是最新的。