数据绑定中的表达式可能吗?如何?

时间:2011-01-29 21:47:09

标签: c# silverlight data-binding windows-phone-7

我有一个集合数据绑定到ListBox。我想要做的是根据集合成员的某些属性是否存在来显示一些UI。

E.g:

public class Widget
{
  public string foo;
  public string bar;
}

public ObservableCollection<Widget> Stuff;

XAML:

<ListBox ItemsSource="{Binding Stuff}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding foo}" 
                 Visiblity="{Binding 
                   (foo != null ? Visibility.Visible : Visibility.Collapsed)
                 }"/>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

请注意Visibility上的TextBlock属性。显然这不受支持,但它应该让你知道我想做什么。

一种可能的解决方案是我可以向窗口小部件添加一个属性,如下所示:

public Visibility has_foo;

然后:

... Visibility="{Binding has_foo}" ...

但是必须生成这些附加属性似乎很尴尬。

我怀疑有更好的方法。在那儿?你会怎么做?

感谢。

1 个答案:

答案 0 :(得分:2)

创建一个值转换器。像

这样的东西
public class NullToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value != null ? Visibility.Visible : Visibility.Collapsed;
    }

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

然后添加类似

的内容
<YourUserControl.Resources>
   <NullToVisibilityConverter x:Key="NullToVisibilityConverter" />
</YourUserControl.Resources>

<ListBox ItemsSource="{Binding Stuff}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding foo}" 
                 Visiblity="{Binding foo, 
                     Converter={StaticResource NullToVisibilityConverter}"/>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

显然我没有实现ConvertBack(不确定你是否能够转换回来)但在这个例子中你不应该需要它。