繁体   English   中英

如何在绑定WPF中使用if表达式-C#

[英]How to use an if expression in Binding WPF - c#

这是我的代码:

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

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

通过样式更改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>

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

但是,最好有两个不同的ViewModel类和两个(我如何称呼它们)“类型定位数据模板”。 假设您有以下几种情况:

abstract class ViewModelItem { }

class Plate : ViewModelItem { }

class IngredientsList : ViewModelItem { }

您将对此进行揭露的内容将设置为ViewModelItem 实际上,您将分配一个PlateIngredientsList实例。

现在,您定义了两个DataTemplates。 关于WPF的一件有趣的事情是,如果您不指定显式模板,则该代码将无法找到一个模板。 它将通过TemplateDataType属性 (样式和类似名称为TargetType)进行匹配。 它的工作方式与CSS相似,有些代码会从中找到要应用的模板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM