2011-01-29 4 views
1

私はListBoxにバインドされたコレクションデータを持っています。私がしたいのは、コレクションのメンバーのいくつかのプロパティが存在するかどうかに基づいてUIを表示することです。データバインディングの式は...可能ですか?の仕方?

例えば:

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> 

TextBlockVisibility属性に注意してください。明らかにこれはサポートされていませんが、私は何をしたいのか分かりません。

public Visibility has_foo; 

そして:

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

しかし、これらの追加のプロパティを生成するために持っている厄介なようだ

一つの可能​​な解決策は、私はそれがこのようになりますウィジェットにプロパティを追加することができたということです。

もっと良い方法があると思います。ある?どうしますか?

ありがとうございました。

答えて

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を実装していませんでした(あなたが戻って変換することができます場合は本当にわからない)がありますが、この中で、それを必要はありませんそれを追加インスタンス。

+0

ブリリアント!私はそのような何かが幸せだったことを知っていた、私はちょうど何を探すべきか分からなかった。ありがとう。私はこれを試してみましょう。 –

+0

IValueConverterには、WP7 OSに重大なパフォーマンス上の問題があります。 ref:PDC 2010 Windows phone 7セッション –

関連する問題