【问题标题】:WPF multibinding visibility of a grid template网格模板的 WPF 多绑定可见性
【发布时间】:2018-07-09 10:57:00
【问题描述】:

我有一个列表视图,每个列表视图包含几列数据。此列表视图包含 2 个网格,1 个网格是标题。 和一个显示所有相关数据的第二个网格。每个项目 我正在尝试执行的是根据数据中某些字段的值隐藏一些数据。

我该怎么做?我尝试了 multiyBinding,但出现错误:

“'Binding' 不能在 'Binding' 类型的 'Path' 属性上设置。'Binding' 只能在 DependencyObject 的 DependencyProperty 上设置。”

希望有代码示例

这是我写的代码

<ListView x:Name="LVGuiCoreBus" ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" MouseDown="LVGui_MouseDown"  Grid.Row="1"  VirtualizingPanel.IsContainerVirtualizable="True" VirtualizingPanel.IsVirtualizing="True"  VirtualizingPanel.IsVirtualizingWhenGrouping="True"  SelectionChanged="LVGuiCoreBus_SelectionChanged">                                     
    <ListView.ItemTemplate>
            <DataTemplate>                      
                <VirtualizingStackPanel >
                    <Grid VirtualizingPanel.VirtualizationMode="Recycling">                           
                        <Grid.Visibility>
                            <MultiBinding>
                                <Binding Path="{Binding Source, Converter={StaticResource VisiblieGroupFilterBySourcecs},UpdateSourceTrigger=PropertyChanged}"></Binding>
                                <Binding Path="{Binding Destination, Converter={StaticResource VisiblieGroupFilterBySourcecs},UpdateSourceTrigger=PropertyChanged}"></Binding>
                            </MultiBinding>
                        </Grid.Visibility>

                    <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="130"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="50"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="50"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="100"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>                                                      
                    <ColumnDefinition Width="70"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="150"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="150"></ColumnDefinition>
                    <ColumnDefinition Width="10"></ColumnDefinition>
                    <ColumnDefinition Width="1*"></ColumnDefinition>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding DateNTimeStr}"  Foreground="Green" Grid.Column="0" />
                        <TextBlock Text="{Binding Source}" Foreground="{Binding Source,Converter={StaticResource CoreBusPanelModuleColorConverter},UpdateSourceTrigger=PropertyChanged}" Grid.Column="2" Background="{ Binding Source, Converter={StaticResource BackGroundFilterConverterBySource}}" />
                        <TextBlock Text="{Binding Destination}" Foreground="{Binding Destination,Converter={StaticResource CoreBusPanelModuleColorConverter},UpdateSourceTrigger=PropertyChanged}" Grid.Column="4" Background="{ Binding Destination, Converter={StaticResource BackGroundFilterConvertorByDestantation}}"  />
                        <TextBlock Text="{Binding Module}" Grid.Column="6" HorizontalAlignment="Center" Background="{ Binding Module, Converter={StaticResource BackGroundFilterByModule},UpdateSourceTrigger=PropertyChanged}"   />
                        <TextBlock Text="{Binding Controll}" Grid.Column="8"  Background="{ Binding Controll, Converter={StaticResource BackGRoundFilterByControll},UpdateSourceTrigger=PropertyChanged}" />
                        <TextBlock Text="{Binding Command}" Grid.Column="10" HorizontalAlignment="Center"  Background="{ Binding Command, Converter={StaticResource BackGroundFilterByCommand},UpdateSourceTrigger=PropertyChanged}" />
                        <TextBlock Text="{Binding HSCommand}" Grid.Column="12" HorizontalAlignment="Center"  Background="{ Binding HSCommand, Converter={StaticResource BackGroundFilterByHsCommand},UpdateSourceTrigger=PropertyChanged}" />
                        <TextBlock Text="{Binding Data_Str}"  Grid.Column="14" />                                                                
            </Grid>
                </VirtualizingStackPanel>
            </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.ContextMenu>
        <ContextMenu x:Name="CMMenuCopy">
            <MenuItem x:Name="MCICopyLine" Header="Copy Line" Click="MCICopyLine_Click" ></MenuItem>
            <MenuItem x:Name="MCICopyText" Header="Copy Only Data Array" Click="MCICopyText_Click" ></MenuItem>
            <MenuItem x:Name="MCIClear" Header="Clear" Click="MCIClear_Click"></MenuItem>
        </ContextMenu>
    </ListView.ContextMenu>
</ListView>

【问题讨论】:

  • 您不想绑定绑定路径。你想要的是这个:&lt;Binding Path="Source" Converter="{StaticResource VisiblieGroupFilterBySourcecs}"/&gt;。也就是说,DataTemplate 中的 VirtualizingStackPanel 毫无意义。它在那里没有效果。
  • 如何根据属性更改进行更新?
  • 不是我得到这个错误:

标签: c# wpf xaml


【解决方案1】:

您应该按照以下两个步骤更改您的代码:

  1. 将您的 Binding 标记扩展更改为 Binding 对象。
  2. IMultiValueConverter 添加到您的`MultiBinding。

因此,您可以像这样更改您的 MultiBinding 用法:

<MultiBinding Converter="{StaticResource YouShouldWriteANewMultiBindingConverterHere}">
    <Binding Path="Source" Converter="{StaticResource VisiblieGroupFilterBySourcecs}" UpdateSourceTrigger="PropertyChanged" />
    <Binding Path="Destination" Converter="{StaticResource VisiblieGroupFilterBySourcecs}" UpdateSourceTrigger="PropertyChanged" />
</MultiBinding>

首先,{Binding xxx, Converter=xxx} 用作 MarkupExtension 只能用于依赖属性。但是当您在MultiBinding 中使用Binding 时,您将其视为Binding 对象而不是MarkupExtension。所以你应该像普通的 XAML 对象一样设置Binding 属性。

其次,MultiBinding 需要 IMultiValueConverterStringFormat 属性集。

public class YouShouldWriteANewMultiBindingConverterHere : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        => throw new NotImplementedException();

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        => throw new NotImplementedException();
}

您可以通过阅读以下内容了解有关MarkupExtensionMultiBindingIMultiValueConverter 的更多信息:

【讨论】:

    猜你喜欢
    • 2018-10-13
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2014-03-31
    • 2011-08-31
    • 2016-01-31
    • 2018-07-28
    相关资源
    最近更新 更多