绑定到ItemsControl的Items属性

时间:2012-01-23 14:36:37

标签: wpf xaml itemscontrol datatrigger

我正在寻找一种方法将Button Text或IsEnabled属性绑定到ItemsControl中的IsChecked属性 这是我的简化源代码:

<StackPanel>
    <ItemsControl ItemsSource="{Binding Tasks}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Margin="10,0,10,0" Text="{Binding Name}"/>
                    <CheckBox IsChecked="{Binding InProgress}"/>
                    <CheckBox IsChecked="{Binding Done}"/>
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Button/>
</StackPanel>

我希望(例如)检查所有“完成”复选框,将按钮文本设置为某个值或启用它。我认为使用DataTriggers在Xaml中使用Data Binding进行此操作但我不知道该怎么做。 Ca有人给我一个完整的xaml解决方案吗?

3 个答案:

答案 0 :(得分:1)

新答案

对不起,我误解了这个问题。如果系统中的所有项目都已选中,我会从您的DataContext中公开另一个属性,只返回true / false,并使用一个属性将您的Button的Text / IsEnabled基于该属性DataTrigger

<Style TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="False" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsAllChecked}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
        </DataTrigger>
    </Style.Triggers>
</Style>

<小时/> 旧答案

DataTriggers只需一个绑定,并检查结果是否等于某个值。

<Style TargetType="{x:Type TextBox}">
    <Setter Property="IsEnabled" Value="False" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Done}" Value="True">
            <Setter Property="IsEnabled" Value="True" />
        </DataTrigger>
    </Style.Triggers>
</Style>

如果您需要测试多个条件,则需要MultiDataTrigger

<Style TargetType="{x:Type TextBox}">
    <Setter Property="IsEnabled" Value="False" />
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=InProgress}" Value="True" />
                <Condition Binding="{Binding Path=Done}" Value="True" />
            </MultiDataTrigger.Conditions>
            <Setter Property="IsEnabled" Value="True" />
      </MultiDataTrigger>
    </Style.Triggers>
</Style>

请注意,setter的默认值是样式的一部分。这很重要,因为如果您在<TextBox>上设置默认值,那么它的优先级高于触发值,因此触发的值无法更改当前值。

答案 1 :(得分:0)

您可以更改此行...

<Button/>

到此

<Button Content={Binding ButtonContent}/>

只要您选中“完成”复选框,就会在ViewModel中设置“按钮内容”属性。

答案 2 :(得分:0)

通常,最好的方法是将要应用于按钮的状态合成到ViewModel的属性中。

在这种情况下,WPFy方式是让ViewModel公开一个实现按钮操作的命令。 该命令轮流可以对数据中的更改做出反应,以便在信号可用或不可用时发出信号,从而自动禁用/启用按钮。另外一个好处是,您可以轻松实现一个菜单,例如,一旦您掌握了命令,就可以免费正确启用/禁用该菜单。

自从我有机会接触WPF已经有很长一段时间了,所以我手边没有任何实用的链接,但如果我是你,我会学习WPF中的命令,它们是WPF的一个非常重要的部分。 MVVM架构。