2011-09-02 41 views
1

我有一个TextBlock,我想要数据绑定到一个List<T>的计数。有点。数据绑定到从列表的计数得到的字符串

我能数据绑定像这样:

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

其中警报是List<String>,它显示了正确的事情。但是,当计数为零时,我想显示“无警报”。

我认为这样做的一个方法是扩展List以便公开一个额外的字符串属性 - 称为CountText - 发出所需的字符串。当计数为零时,它可能会发出“无警报”,并在Count==1时发出“一次警报”。这会工作吗?

如果我这样做,我如何获得Count中的更改以产生的PropertyChanged事件,以便它会在WPF UI中更新?

是获得我想要的效果的首选方式?

+0

不它必须是'List '或者你可以使用另一个集合(比如'ObservableCollection ')?另外显示的文本应该是'计数== 2'等? – svick

+0

IValueConverter(下面给出的答案)是完全按照您的要求做的最佳做法。它将一个已知的值(一个数字或一些这样的值)更改为一个显示值,然后再返回。然后关注数据和显示仍然分开。 – EtherDragon

回答

2

完成此操作的一种方法是创建一个IValueConverter,如果该值为零和/或您想添加自定义文本的任何其他数字将返回一个字符串。至于在计数发生变化时更新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(); 
    } 
} 
<UserControl.Resources> 
    <local:AlertCountConverter x:Key="AlertCountConverter"/> 
</UserControl.Resources> 
<TextBlock x:Name="tbAlerts" Text="{Binding Alerts.Count, Converter={StaticResource AlertCountConverter}}"/> 
4

除了转换器解决方案,你也能做到这一点直接在XAML通过改变Text属性设置为“无项目”当你在列表中没有的项目

<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> 
+1

我总是忘记这件事,直到我看到它在stackoverflow上。我需要开始这样做,而不是写一堆转换器。 –