首页 文章

绑定到ItemsControl的Items属性

提问于
浏览
0

我正在寻找一种方法将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

    New Answer

    对不起,我误解了这个问题 . 我会公开你的 DataContext 中的另一个属性,如果检查了集合中的所有项目,则只返回true / false,并使用 DataTrigger 将你的Button的 Text / IsEnabled 基于该属性 .

    <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>
    

    Old Answer

    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> 上设置默认值,则它的优先级高于触发值,因此触发的值无法更改当前值 .

  • 0

    你可以改变这一行......

    <Button/>
    

    对此

    <Button Content={Binding ButtonContent}/>
    

    每当选中“完成”复选框时,在ViewModel中设置“ButtonContent”属性 .

  • 1

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

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

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

相关问题