我有一個ListView, 其專案由ItemTemplate如下所示:
<ListView dependencyObjects:InterestingItem.Interesting="{Binding InterestingItem}"
ItemsSource="{Binding Quotations}" >
<ListView.ItemTemplate>
<DataTemplate>
<Border>
<Grid>
<StackPanel x:Name="NotImportant">
</StackPanel>
<Grid x:Name="HiddenGrid"
Background="Red"
Visibility="Hidden" >
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<Grid.Triggers>
<DataTrigger Binding="{Binding Path=DataContext.InterestingItem,
RelativeSource={RelativeSource AncestorType={x:Type ListView }}}"
Value="*this instance here*!">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Grid.Triggers>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
該ListView有一個附加屬性,InterestingItem那就是在該專案中的一個ListView。
我無法連接的是當InterestingItem它與其中一個專案相同時,第二個Grid應該變得可見。
我不想更改并系結到串列中的實際物件 - 而是ListView控制要更改的專案。
什么是Value的DataTrigger,我需要?
uj5u.com熱心網友回復:
您的 XAML 中存在多個問題,并且在概念上阻止它作業。
要系結附加屬性,您必須使用帶括號的正確語法。
Path="{Binding (local:InterestingItem.Interesting), RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"請參閱系結路徑語法檔案以供參考。
該
Triggers屬性僅支持EventTriggers,請參閱FrameworkElement.Triggers。注意在一個元素上建立的觸發器集合只支持EventTrigger,不支持屬性觸發器(Trigger)。如果需要屬性觸發器,則必須將它們放置在樣式或模板中,然后直接通過 Style 屬性或通過隱式樣式參考間接將該樣式或模板分配給元素。
您不能系結 的
Value屬性DataTrigger,因為它不是依賴屬性。
您當然可以更改系結型別以公開一個屬性,該屬性指示它是否是特殊物件,并在 XAML 中使用 a 系結它DataTrigger,類似于此(IsSpecial新bool屬性在哪里)。
<Grid x:Name="HiddenGrid"
Background="Red">
<TextBlock Text="Hidden Grid"/>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSpecial}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
如果您想堅持當前的方法,您可以創建一個自定義IMultiValueConverter來啟用系結多個屬性。它將檢查所有系結值是否相等并回傳Visibility.Visible或Visibility.Hidden以其他方式回傳。本示例使用 Linq 進行檢查并支持任意數量的值系結,但還有許多其他選項。
public class EqualityToVisibilityConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values is null || values.Length < 2)
return Binding.DoNothing;
return values.Distinct().Count() == 1 ? Visibility.Visible : Visibility.Hidden;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new InvalidOperationException();
}
}
接下來,ListView在范圍內的資源字典或任何其他資源字典中實體化轉換器,并將 的Visibility屬性系結Grid到當前專案(只是<Binding/>)和使用轉換器將它們轉換為local:InterestingItem.Interestinga的附加屬性。MultiBindingVisibility
<ListView local:InterestingItem.Interesting="{Binding InterestingItem}"
ItemsSource="{Binding Quotations}">
<ListView.Resources>
<local:EqualityToVisibilityConverter x:Key="EqualityToVisibilityConverter"/>
</ListView.Resources>
<ListView.ItemTemplate>
<DataTemplate>
<Border>
<Grid>
<StackPanel x:Name="NotImportant">
<TextBlock Text="Not Important"/>
</StackPanel>
<Grid x:Name="HiddenGrid"
Background="Red">
<Grid.Visibility>
<MultiBinding Converter="{StaticResource EqualityToVisibilityConverter}">
<Binding/>
<Binding Path="(local:InterestingItem.Interesting)"
RelativeSource="{RelativeSource AncestorType={x:Type ListView}}"/>
</MultiBinding>
</Grid.Visibility>
<TextBlock Text="Hidden Grid"/>
</Grid>
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
這里還有兩點需要注意。我添加了兩個 dummy TextBlocks,否則結果將不可見,因為面板是空的。用您的內容替換它們。此外, theStackPanel和 theGrid在 parent 中都重疊Grid,我不知道這是否是故意的,但是您可以通過添加行或列并將元素移動到那里來更改它。
uj5u.com熱心網友回復:
我需要的 DataTrigger 中的值是多少?
恐怕 XAML 不支持thisC# 中的關鍵字之類的東西。
您可以將 aMultiBinding與IMultiValueConverter確定專案是否相等的實作一起使用:
<Grid x:Name="HiddenGrid" Background="Red">
<Grid.Style>
<Style TargetType="Grid">
<Setter Property="Visibility" Value="Hidden" />
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding>
<MultiBinding.Converter>
<local:MultiConverter />
</MultiBinding.Converter>
<Binding Path="{Binding Path=DataContext.InterestingItem,
RelativeSource={RelativeSource AncestorType={x:Type ListView }}}" />
<Binding Path="{Binding}" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
轉換器:
public class MultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) =>
values != null && values.Length == 2 && values[0] == values[1];
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) =>
throw new NotSupportedException();
}
請注意,如果您希望能夠使用setter覆寫該值,則不能將 的Visibility屬性設定Grid為本地值Style。
<Grid x:Name="HiddenGrid" Background="Red" Visibility="Hidden">
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/318310.html
