2016-09-03 5 views
0

私はこのようなListBoxました:私はTextBlockののリストでDataTemplateをしました、その中バインドされた値がnullの場合は項目を非表示にしますか?

<ListBox VerticalAlignment="Stretch" 
     ItemsSource="{Binding EventInfo}"> 

を:私は何をする必要があるか

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="100"/> 
       <ColumnDefinition Width="20"/> 
      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <TextBlock Text="Event:" FontWeight="Bold" Grid.Column="0" Grid.Row="0"/> 
      <TextBlock Text="{Binding Name}" FontWeight="Bold" Grid.Column="1" Grid.Row="0"/> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

は、例えばときのTextBlockを隠しています、バインドされた値はnullです。

Event: foo 

しかしNameがnullのいくつかの場合には、私は両方TextBlockEventとバインドさを非表示にする必要があり、これを行うことも可能である:私はこのようなものが準きましたか?

UPDATE:

私はXAMLでこの純粋をやろうとしているよう:

:問題は、アプリケーションの中断モードでの秋ととしてXAMLエラーは私が得ることだ

<Style TargetType="TextBlock"> 
    <Style.Triggers> 
      <Trigger Property="Text" Value=""> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
      <Trigger Property="Text" Value="{x:Null}"> 
       <Setter Property="Visibility" Value="Collapsed" /> 
      </Trigger> 
    </Style.Triggers> 
</Style> 

System.Windows.Data Error: 40 : BindingExpression path error: 'Name' property not found on 'object' ''Style' (HashCode=7)'.

このエラーは、私が間違っているテキストブロックごとに繰り返されますか?

答えて

1

あなたは/非表示にすることができなければならないすべての要素の

Visibility="{Binding IsVisibleName, Converter={StaticResource myBoolToVisibilityConverter}} 
静的ブール変換器を介し

<local:BooleanToVisibiltyConverter x:Key="myBoolToVisibilityConverter" /> 

プロパティに可視性をバインドすることができます。

その後コンバータは条件が満たされた場合、たとえばのように、あなたは、それらを設定します目に見える

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    bool isVisible = (bool)value; 
    return (isVisible ? Visibility.Visible : Visibility.Collapsed); 
} 

に真の変換に(これが一般的な考え方ですが、私はあなたの特定の詳細については知りません)名前セッターデータがトリガされている純粋なXAMLで

public string Name 
{ 
    get { return name;} 
    set 
    { 
     name = value; OnPropertyChanged("Name"); 
     IsVisibleName = name != null; IsVisibleEvent = event != null && name != null; 
    } 
} 

(とあなたにも他のすべてのトリガーを設定する必要がある)

<Style.Triggers> 
    <DataTrigger Binding="{Binding SomeValue}" Value=" x:Null "> 
     <Setter Property="Visibility" Value="Visible"/> 
    </DataTrigger> 
</Style.Triggers> 
+0

これは純粋なxamlでのみ可能ですか? – AgainMe

+0

はい、純粋なxamlでデータトリガーを定義することはできますが、私は個人的にセッターメソッドをより明確でより強力なものにしています...私の回答を編集してxamlトリガーの例も挿入します –

+0

私の更新をご覧ください。私はxamlでこれを純粋にすることを試みていますが、それは私のコードでは間違っていると思います。 – AgainMe

1

ここでNullToVisibilityConverterを使用することができますが、(折りたたまれた)TextBlockがListBoxItemContainerの周りにパディングされるため、ListBoxに疑わしいギャップがあることがわかります。さらに悪いことに、この「ギャップ」は依然としてユーザーが選択することができます。

これらの問題も、私は非常に多くのロジックについてをユーザに提示(ただし、除くべきであるあなたのViewModelでEventInfoからこれらの値をフィルタリングすることをお勧めしますNullToVisbilityConverterと同様のアプローチを使用して解決することができるがどのようにが提示されるべきか)を見つけなければならない。

+0

男、私は私の答えに飛び込む前にこれを読んでほしい。あなたのものは正しいアプローチです。ベースリストをObservableCollectionにファサードし、そこからヌルを除外し、リストボックスをObservableCollectionにバインドして、関連するコードポイントでnotifypropchangeを実行します。ベースリスト) – code4life

関連する問題