IValueConverter выполняется больше раз, чем ожидалось - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть конвертер, который берет текст из TextBlock, который составляет DataGridCell, и преобразует его в красную или черную кисть в зависимости от того, является ли значение отрицательным или положительным. Однако конвертер выполняется больше раз, чем есть элементы в источнике данных сетки. Например, если я просто связываю коллекцию, которая содержит 1 объект, конвертер выполняется 2 раза. В первый раз параметр value представляет собой пустую строку, во второй раз он фактически содержит значение, которое я ожидал. Если я добавлю больше объектов в список, число начальных «пустых» выполнений возрастет. Что я делаю не так?

<Window.Resources>
    <conv:NumericValueBrushColorConverter x:Key="NumericValueBrushColorConverter"></conv:NumericValueBrushColorConverter>
</Window.Resources>

<DataGrid ItemsSource="{Binding CashReport}" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Beginning Cash Available" Binding="{Binding BeginningBalance, StringFormat={}{0:C}}">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="TextBlock">
                    <Setter Property="HorizontalAlignment"  Value="Right" />
                    <Setter Property="Foreground" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Text, Converter={StaticResource NumericValueBrushColorConverter}}"/>      
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid> 


[ValueConversion(typeof(string), typeof(SolidColorBrush))]
internal class NumericValueBrushColorConverter : IValueConverter
{
    static int i = 0;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string strValue = value as string;
        i++;
        if(string.IsNullOrEmpty(strValue)) return new SolidColorBrush(Colors.Black);

        if (strValue.StartsWith("("))
        {
            return new SolidColorBrush(Colors.Red);
        }
        else
        {
            return new SolidColorBrush(Colors.Black);
        }
    }
    ...
}   

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Ну, сначала TextBlock в строке сетки создается и, таким образом, становится пустым (= первое выполнение), а затем содержимое привязывается к значению текущего элемента (= второе выполнение). Здесь все в порядке.

2 голосов
/ 08 декабря 2011

Полагаю, @ Даниэль Хилгарт прав.Вы должны проверить значение в вашем конвертере, прежде чем пытаться конвертировать.Вы можете вернуть Binding.DoNothing, если не хотите, чтобы выполнялась привязка.

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