Выражения в привязке данных ... возможно?Как? - PullRequest
1 голос
/ 30 января 2011

У меня есть коллекция данных, привязанная к ListBox.Я хотел бы показать некоторый пользовательский интерфейс, основанный на том, существует ли какое-либо свойство члена коллекции.

Например:

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 Ответ

2 голосов
/ 30 января 2011

Создать конвертер значений.Что-то вроде

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 (не совсем уверен, сможете ли вы конвертировать обратно), но вы не должнынужно в этом случае.

...