如果一个集合计数等于另一个集合,则 WPF 隐藏 TextBlock

问题描述

你好,

我正在设置我的 WPF 窗格,以根据绑定到 ListView 的多个视图模型集合的值显示一些文本。

文本显示在堆栈面板中,显示集合中的视图数,然后是另一个文本块,如果有隐藏则显示

这是通过以下绑定计算出来的:

browser.Count = 这是总浏览次数

browserItemCollectionView.Count = 这是隐藏的浏览次数

基本上,如果 browser.Count == browserItemCollectionView.Count,我希望文本隐藏

这是 XAML 代码

                    <StackPanel Orientation="Horizontal">

                    <TextBlock x:Name="TotalCount"
                               Foreground="#FF6F6F6F">
                        <Run Text="{Binding Path=browser.Count,Mode=OneWay}" />
                        <Run Text=" Views" />
                    </TextBlock>
                    
                    <TextBlock x:Name="SearchCount"
                               Foreground="#FF6F6F6F">
                        <TextBlock.Style>
                            <Style targettype="TextBlock">

                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=browserItemCollectionView.Count,Mode=OneWay}"
                                                 Value="---SOME CLever BINDING HERE---">
                                        <Setter Property="UIElement.Visibility"
                                                Value="Hidden" />
                                    </DataTrigger>
                                </Style.Triggers>

                            </Style>
                        </TextBlock.Style>
                        <Run Text=",("></Run>
                        <Run Text="{Binding Path=browserItemCollectionView.Count,Mode=OneWay}"></Run>
                        <Run Text=" visible.)"></Run>
                    </TextBlock>

                </StackPanel>

所以我认为这很容易改变上面的DataTrigger:

                <DataTrigger Binding="{Binding Path=browserItemCollectionView.Count,Mode=OneWay}"
                             Value="{Binding Path=browser.Count,Mode=OneWay}">
                       <Setter Property="UIElement.Visibility"
                               Value="Hidden" />
                </DataTrigger>

但这不起作用,因为错误指出无法将值设置为绑定...

最简单的方法是什么?

谢谢。

解决方法

您可以将 DataTriggerMultiBinding 一起使用。

<DataTrigger Value="True">
    <DataTrigger.Binding>
        <MultiBinding Converter="{StaticResource MyCustomConverter}">
            <Binding Path="BrowserItemCollectionView.Count" />
            <Binding Path="Browser.Count" />
        </MultiBinding>
    </DataTrigger.Binding>
    <Setter Property="UIElement.Visibility" Value="Hidden" />
</DataTrigger>

绑定到两个属性并使用 MultiValueConverter 检查这些属性的值是否相等。

public class MyCustomConverter : IMultiValueConverter
{
    public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture)
    {
        if (values.Length != 2)
        {
            return false;
        }
        var value1 = values[0];
        var value2 = values[1];

        return value1.Equals(value2);

    }

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

第二个选项是在您的视图模型上创建一个 bool 属性,并在您的视图模型中创建一个将该属性设置为 true/false 的逻辑。绑定到 DataTrigger 中的该属性。

private bool collectionsEqual;
public bool CollectionsEqual
{
    get { return collectionsEqual; }
    set
    {
        collectionEqual = value;
        OnPropertyChanged()
    }
}
...
<DataTrigger Binding="{Binding Path=CollectionsEqual}" Value="True">
    <Setter Property="UIElement.Visibility" Value="Hidden" />
</DataTrigger>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...