[英]WPF multibinding visibility of a grid template
我有一個列表視圖,其中每個列表視圖都包含幾列數據。 此列表視圖包含 2 個網格,其中 1 個網格是標題。 和顯示所有相關數據的第二個網格。我試圖執行的每個項目是隱藏一些數據,每個屬性數據中某些字段的值。
我怎樣才能做到這一點? 我嘗試了 multiyBinding,但出現錯誤:
“無法在“綁定”類型的“路徑”屬性上設置“綁定”。只能在 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>
您應該按照以下兩個步驟更改代碼:
Binding
標記擴展更改為Binding
對象。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
需要IMultiValueConverter
或StringFormat
屬性集。
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();
}
您可以通過閱讀以下內容了解有關MarkupExtension
、 MultiBinding
、 IMultiValueConverter
的更多信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.