web-dev-qa-db-ja.com

コンボボックスのバインドされたアイテムでコンバーターを使用する

次のようなデータテーブル列にバインドされているコンボボックスがあります:

ComboBox.DataContext = DataDataTable;                
ComboBox.DisplayMemberPath = DataDataTable.Columns["IDNr"].ToString();

列のIDNrは常に4文字で始まり、その後にID番号が続きます(例:BLXF1234)。アイテムを文字なしでコンボボックスに表示する必要があります(コンボボックスに1234を表示する必要があります)。

だから私はコンバーターを書いた:

class IDPrefixValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null)
        {
            string s = value.ToString();
            if (s.Contains("BL"))
            {
                return s.Substring(4);
            }
            else
            {
                return s;
            }
        }
        return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }       

いいえ、コンバータを使用してアイテムを表示するようにコンボボックスに指示するにはどうすればよいですか?私はこれをXamlで試しました:

ItemsSource="{Binding}" 
DisplayMemberPath="{Binding Converter={StaticResource IDPrefixValueConverter}}"

しかし、まだ機能していません...任意のアイデア?ありがとう

30
lebhero

ItemTemplateComboBoxを変更して、コンバータを使用できます。

<ComboBox ItemsSource="{Binding}">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Converter={StaticResource IDPrefixValueConverter}}"/>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

各アイテムはItemsSourceのアイテムにバインドされています。バインディングでコンバーターを使用することにより、必要な変換を実行できます。

61