2017-09-11 4 views
0

次のような状況があります。私は文字列のリストを表示したい。これを実現するために、ListViewを文字列のコレクションにバインドしています。このコレクションには、空の文字列がいくつかあります。私がしたいのは、空の文字列が存在するときに次のテキストを表示することです: "--empty-"。これは私がこれまでに得たものである(ソースコードは、デモンストレーションのみを目的です):UWP、ListViewのアイテムソースが文字列のコレクションである場合、ListViewのアイテムにコンバーターを適用します。

EmptyStringConverter.cs

public class EmptyStringConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     if (value is string && string.IsNullOrWhiteSpace((string)value)) 
     { 
      return "-empty-"; 
     } 
     return value; 
    } 

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

MainPage.xamlを

<Page 
     x:Class="App1.MainPage" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="using:App1" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d"> 

    <Page.Resources> 
     <local:EmptyStringConverter x:Key="EmptyStringConverter" /> 
    </Page.Resources> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 

     <ListView x:Name="ListView"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Converter={StaticResource EmptyStringConverter}}" Margin="0,0,0,5" /> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </Grid> 
</Page> 

MainPage.xaml.cs

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     var source = new[] { "", "String 1", "String 2" }; 
     ListView.ItemsSource = source; 
    } 
} 

EmptyStringConverterクラスのConvertメソッドにブレークポイントを設定すると、このメソッドはi n空の文字列を除くすべての項目。私は何をしたいのですか?

答えて

0

問題は私が最後に確認する場所にありました。問題の原因となっているのはLegacy Bindingです。私は自分自身でコードスニペットを試してみました。 2の注意を払ってください

<ListView x:Name="ListView" > 
     <ListView.ItemTemplate> 
      <DataTemplate x:DataType="x:String"> 
       <TextBlock Text="{x:Bind Converter={StaticResource EmptyStringConverter},Mode=OneTime}" Margin="0,0,0,5" /> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
</ListView> 

:以下の行は、あなたがあなたのListViewXAMLを変更して問題を修正しますCompile time bindingに切り替えることができますUWPを使用しているのでだろうlegacy binding

Text="{Binding Converter={StaticResource EmptyStringConverter}}"

を使用していますもの:

  1. Text の代わりにを使用しますレガシーBindingがデフォルトでOneWayバインディングである場合、コンパイル時バインディングはデフォルトでoneTimeバインディングであることに注意してください(モードを明示的に指定しない限り)。コンパイル時のバインドの詳細については、xBind markup extensionを参照してください。
  2. 宣言に気付いた場合は、DataTypeプロパティが保持されます。これは、コンパイル時のバインダーがどのような種類のデータを期待しているかを知るのに役立ちます。 DataTypeの詳細については、xBind markup extensionをご覧ください。

すべてのことは、私は非常に新しいコンパイル時間は、変換の多くは、少ないコードと努力につながるバインディングエンジン自体によって処理される結合と同様に代わりListView.ItemSource=sourceData Bindingアプローチを使用することをお勧めします言われていますあなたの最後に。私はあなたがそれをチェックアウトすることができます同じのgithubのサンプルを入れて:EmptyStringDemo

関連する問題