ComboBox.Text без учета свойства ItemStringFormat - PullRequest
2 голосов
/ 17 мая 2010

Я только что заметил странное поведение, которое выглядит как ошибка. Рассмотрим следующий XAML:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <Page.Resources>
    <x:Array x:Key="data" Type="{x:Type sys:String}">
        <sys:String>Foo</sys:String>
        <sys:String>Bar</sys:String>
        <sys:String>Baz</sys:String>
    </x:Array>
  </Page.Resources>
  <StackPanel Orientation="Vertical">
      <Button>Boo</Button>
      <ComboBox Name="combo" ItemsSource="{Binding Source={StaticResource data}}" ItemStringFormat="##{0}##" />
      <TextBlock Text="{Binding Text, ElementName=combo}"/>
  </StackPanel>
</Page>

ComboBox отображает значения в виде "## Foo ##", "## Bar ##" и "## Baz ##". Но TextBlock отображает выбранные значения как «Foo», «Bar» и «Baz». Так что ItemStringFormat явно игнорируется для свойства Text ...

Это ошибка? Если это так, есть ли обходной путь?
Или я просто что-то не так делаю?

Ответы [ 2 ]

1 голос
/ 17 мая 2010

Это не ошибка: ItemStringFormat - это просто ярлык для «шаблона данных с текстовым блоком, привязанным к значению с указанным форматом строки, установленным в привязке». Однако Text обычно используется, когда IsEditable имеет значение true и представляет ввод пользователя. Если в вашем списке есть что-то кроме строк, предпочтительно использовать SelectedItem, а не Text. В любом случае следующий код будет повторно применять формат к тексту:

<TextBlock Text="{Binding ElementName=combo, Path=Text, StringFormat='##{0}##'}"/>
0 голосов
/ 10 октября 2013

Я знаю, что, вероятно, уже слишком поздно, чтобы помочь ОП, но на тот случай, если кто-то еще наткнется на это ...

Решение, которое я бы использовал для решения реальной проблемы, заключающейся в том, что ОП, упомянутая в комментарии к другому ответу, заключается в использовании IValueConverter.

Вот код для FormatConverter класса:

public class FormatConverter : System.Windows.Data.IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string format = parameter.ToString();
        return string.Format(format, value);
    }

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

А вот как вы его используете (взято из вопроса с модификацией):

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"
  xmlns:local="clr-namespace:YourNamespace">
  <Page.Resources>
    <x:Array x:Key="data" Type="{x:Type sys:String}">
      <sys:String>Foo</sys:String>
      <sys:String>Bar</sys:String>
      <sys:String>Baz</sys:String>
    </x:Array>
    <local:FormatConverter x:Key="FormatConverter" />
  </Page.Resources>
  <StackPanel>
    <ComboBox ItemsSource="{Binding Source={StaticResource data}}" ItemStringFormat="##{0}##"
              Text="{Binding Path=VMProp, Mode=OneWayToSource, Converter={StaticResource FormatConverter}, ConverterParameter=##{0}##}" />
  </StackPanel>
</Page>

Это приведет к тому, что элементы будут отображаться в ComboBox как "## Foo ##", "## Bar ##" и "## Baz ##" благодаря установке ItemStringFormat на "## {0} ##". Кроме того, свойству VMProp в ViewModel будут присваиваться значения в том же формате, когда они выбраны, благодаря FormatConverter с ConverterParameter, установленным на "## {0} ##".

Обратите внимание, что хотя я использовал свойство ComboBox.Text, чтобы сохранить соответствие первоначальному вопросу, я бы предположил, что свойство ComboBox.SelectedItem будет более подходящим. ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...