Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 数据绑定到从列表计数派生的字符串_Wpf_Data Binding - Fatal编程技术网

Wpf 数据绑定到从列表计数派生的字符串

Wpf 数据绑定到从列表计数派生的字符串,wpf,data-binding,Wpf,Data Binding,我有一个文本块,我想将其数据绑定到列表的计数。有点 我可以这样绑定它: <TextBlock Name="tbAlerts" Text="{Binding Path=Alerts.Count}" /> 其中警报是一个列表,它显示正确的内容。但是,我希望在计数为零时显示“无警报” 我认为这样做的一种方法是扩展List,以公开一个额外的字符串属性,称之为CountText,它将发出所需的字符串。当计数为零时,它可能发出“无警报”,当计数=1时,它可能发出“一个警报”。这样行吗 如果

我有一个
文本块
,我想将其数据绑定到
列表的计数
。有点

我可以这样绑定它:

<TextBlock Name="tbAlerts" Text="{Binding Path=Alerts.Count}" />

其中警报是一个
列表
,它显示正确的内容。但是,我希望在计数为零时显示“无警报”

我认为这样做的一种方法是扩展List,以公开一个额外的字符串属性,称之为
CountText
,它将发出所需的字符串。当计数为零时,它可能发出“无警报”,当计数=1时,它可能发出“一个警报”。这样行吗

如果我这样做,我将如何使计数的更改导致
CountText
PropertyChanged
事件,以便在WPF UI中更新它


这是获得我想要的效果的首选方法吗?

实现这一点的一种方法是创建一个字符串,如果值为零和/或任何其他要添加自定义文本的数字,该字符串将返回一个字符串。至于在计数更改时更新UI,每当从警报列表中添加/删除项目时,您必须调用列表上的PropertyChanged处理程序

public class AlertCountConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string result = null;
        if (value != null)
        {
            int count = System.Convert.ToInt32(value);
            if (value == 0)
               result = "No Alerts";
            else
               result = count.ToString();
         }
         return result;

     }

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
     {
         return new NotImplementedException();
     }
}

实现这一点的一种方法是创建一个值,如果该值为零和/或任何其他要添加自定义文本的数字,则该值将返回一个字符串。至于在计数更改时更新UI,每当从警报列表中添加/删除项目时,您必须调用列表上的PropertyChanged处理程序

public class AlertCountConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string result = null;
        if (value != null)
        {
            int count = System.Convert.ToInt32(value);
            if (value == 0)
               result = "No Alerts";
            else
               result = count.ToString();
         }
         return result;

     }

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
     {
         return new NotImplementedException();
     }
}

除了转换器解决方案之外,当列表中没有项目时,还可以通过将
Text
属性更改为“No Items”直接在Xaml中实现

<TextBlock Name="tbAlerts">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Text" Value="{Binding Path=Alerts.Count}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Alerts.Count}" Value="0">
                    <Setter Property="Text" Value="No Items"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

除了转换器解决方案之外,当列表中没有项目时,还可以通过将
Text
属性更改为“No Items”直接在Xaml中实现

<TextBlock Name="tbAlerts">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Text" Value="{Binding Path=Alerts.Count}"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Alerts.Count}" Value="0">
                    <Setter Property="Text" Value="No Items"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>


它必须是
列表
还是可以使用另一个集合(如
可观察集合
)?另外,对于
Count==2
等,显示的文本应该是什么?IValueConverter(下面给出的答案)是完全按照您的要求执行操作的最佳实践。它将已知值(数字或类似值)更改为显示值,然后再次更改。然后,数据和显示的关注点保持分离。它必须是
列表
,还是可以使用另一个集合(如
ObservableCollection
)?另外,对于
Count==2
等,显示的文本应该是什么?IValueConverter(下面给出的答案)是完全按照您的要求执行操作的最佳实践。它将已知值(数字或类似值)更改为显示值,然后再次更改。然后对数据和显示的关注保持分离。我总是忘记这一点,直到我在stackoverflow上看到它。我需要开始这样做,而不是编写一堆转换器。我总是忘记这一点,直到我在stackoverflow上看到它。我需要开始这样做,而不是编写一堆转换器。