【问题标题】:How to use an if expression in Binding WPF - c#如何在绑定 WPF 中使用 if 表达式 - c#
【发布时间】:2019-08-30 21:40:06
【问题描述】:

这是我的代码:

<ListView Grid.Row="1" x:Name="viewTicket" Style="{StaticResource ticketListBox}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Background="Transparent" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" BorderBrush="{x:Null}" SelectionChanged="ViewTicket_SelectionChanged">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Grid Grid.Row="0">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="4*"/>
                        <ColumnDefinition Width="2*"/>
                    </Grid.ColumnDefinitions>
                    <Image Visibility="{Binding selectedCheck}" Name="check" Grid.Column="0" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Source="../../Images/check-donatota.png" Stretch="None" MouseLeftButtonUp="Check_MouseLeftButtonUp"/>
                    <TextBlock Visibility="{Binding selectedQuantity}" Name="quantity" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding amount}"/>
                    <TextBlock Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="Black" TextWrapping="Wrap" Text="{Binding name}"/>
                    <TextBlock Visibility="{Binding selectedPrice}" Name="price" Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding total, StringFormat=C}"/>
                    <Image Visibility="{Binding selectedTrash}" Name="trash" Grid.Column="2" Margin="0,0,15,0" HorizontalAlignment="Right" VerticalAlignment="Center" Source="../../Images/trash-donatota.png" Stretch="None" MouseLeftButtonUp="Trash_MouseLeftButtonUp"/>
                </Grid>

                <ListView 
                    ItemsSource="{Binding ingredients}" 
                    Grid.Row="1" 
                    Margin="-5,0,0,0" 
                    Name="viewTicketIngs" 
                    IsHitTestVisible="False" 
                    Style="{StaticResource ticketListBox}"
                    ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                    ScrollViewer.VerticalScrollBarVisibility="Hidden" 
                    Background="Transparent" 
                    HorizontalContentAlignment="Stretch" 
                    VerticalContentAlignment="Center" 
                    BorderBrush="{x:Null}" 
                    SelectionChanged="ViewTicketIngs_SelectionChanged">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="4*"/>
                                    <ColumnDefinition Width="2*"/>
                                </Grid.ColumnDefinitions>
                                <TextBlock Visibility="Visible" Name="quantity" Grid.Column="0" Foreground="{DynamicResource GrayTextDonaTotaBrush}" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding amount}"/>
                                <TextBlock Margin="10,0,0,0" Grid.Column="1" Foreground="{DynamicResource GrayTextDonaTotaBrush}" HorizontalAlignment="Left" VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding ing.name}"/>
                                <TextBlock Visibility="Visible" Name="price" Grid.Column="2" Foreground="{DynamicResource GrayTextDonaTotaBrush}" HorizontalAlignment="Right" VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding total, StringFormat=C}"/>
                            </Grid>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我将数据添加到ListViewviewTicket,但根据属性我想更改ListViewviewTicketIngsItemSource 绑定。换句话说,无论如何我可以在绑定上使用 if 表达式吗?类似ItemsSource="{Binding IF(mode == 0) {ingredients} else {plates}}"

【问题讨论】:

  • 也许创建一个ListView &lt;DataTemplate.Triggers&gt; 但在你的ViewModel上绑定到mode
  • 请注意,由于您没有设置 ListView 的 View 属性,而只是分配了一个简单的 ItemTemplate,所以您不妨使用 ListBox,即 ListView 的基类。它更简单。

标签: c# wpf data-binding wpf-controls


【解决方案1】:

据我了解,您有时会展示盘子,有时会展示配料。现在有触发器条件显示。 WPF 实际上有相当广泛的支持。

但是,最好有 2 个不同的 ViewModel 类和两个(我如何称呼它们)“类型定位数据模板”。假设你有这些类:

abstract class ViewModelItem { }

class Plate : ViewModelItem { }

class IngredientsList : ViewModelItem { }

您在其中公开的属性将设置为ViewModelItem。实际上,您可以分配 PlateIngredientsList 实例。

现在您定义了两个 DataTemplate。关于 WPF 的一个有趣的事情是,如果您不指定显式模板,代码将不遗余力地尝试找到一个模板。它将通过DataType property of the Template(样式和类似的目标类型)进行匹配。它的工作方式类似于 CSS 的工作方式,有些代码会不经意间找到要应用的模板。

【讨论】:

  • @Clemens 我确实觉得这是个错误的问题。成分和盘子听起来这两个案例没有足够的共同点,甚至无法由同一个 ViewModel 类处理。兄弟阶层的阶层?可能是。同班?大概不是。而且很少有人知道类型定位数据模板可能是解决更大问题的更简单方法。
  • 所有这些都与问题完全无关。 “类型定位数据模板”,认真的吗?这里的上下文在哪里? OP 只想在两个源集合之间切换。
  • @Clemens 为什么你删除了我回复的原始评论?此外,当这种方式可能更清洁时,为什么要使用多重绑定?看起来你的答案比我的更接近目标,所以你几乎没有资格跟我说话。
  • 您的帖子实际上并不是问题的答案。当其他一些属性发生变化时,它并没有解决如何在两个绑定之间切换到两个不同属性的问题。我也不建议使用 MultiBinding,请参阅我的回答。如果您指的是我对其他答案的评论,如果您不理解,请告诉我。
  • @Clemens 我听说你在你说的前 3 次发出了问题。还是不同意。
【解决方案2】:

通过样式中的 DataTrigger 更改绑定:

<ListView ...>
    <ListView.Style>
        <Style TargetType="ListView">
            <Setter Property="ItemsSource" Value="{Binding plates}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding mode}" Value="0">
                    <Setter Property="ItemsSource" Value="{Binding ingredients}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.Style>
</ListView>

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多