Где установить конвертер для элементов коллекции в XAML - PullRequest
3 голосов
/ 03 октября 2011

Я только что сделал свой первый конвертер для преобразования из int в строку. У меня есть поле со списком, заполненное целыми числами (годами), но если значение равно 0, я хочу, чтобы в поле со списком было показано «Все».

Это мой конвертер:

public class IntToString : IValueConverter
{
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                int intY = (int)value;

                if (intY == 0)
                {
                    String strY = "All";
                    return strY;
                }
                else
                {
                    return intY.ToString();
                }
            }

            return String.Empty;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {

        }
    }

В XAML где мне установить конвертер? Я попытался в ItemsSource комбинированного списка:

ItemsSource="{Binding YearsCollection, Converter={StaticResource intToStringYearConverter}}"

Но я всегда получаю InvalidcastException в этой строке:

int intY = (int)value;

Ответы [ 2 ]

7 голосов
/ 03 октября 2011

Проблема в том, что вы пытаетесь преобразовать всю коллекцию, а не только один элемент из коллекции.

Вы хотели бы сделать что-то вроде этого:

<ListBox ItemsSource="{Binding YearsCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
             <Border DataContext="{Binding Converter={StaticResource intToStringYearConverter}">
             ...
             </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
2 голосов
/ 03 октября 2011

Вы не можете использовать конвертер как этот, конвертер в ItemsSource должен конвертировать всю коллекцию, а не отдельные элементы.Объект коллекции не может быть приведен к целому числу, поэтому вы получаете исключение.

Необходимо использовать DataTemplate и применить преобразователь к отдельным элементам.

Или - если все, что вам нужно, это приведениедля int - вы можете использовать ItemStringFormat .

Кроме того, для установки сообщения по умолчанию, когда источник имеет значение null, вы можете использовать TargetNullValue свойство Binding.

...