Создание нового экземпляра ValueConverter для каждого элемента ListBox - PullRequest
0 голосов
/ 18 октября 2019

Я определил следующее перечисление для представления битового поля в моей программе:

[Flags]
public enum CXIOByte
{
    None = 0,
    Bit0 = 1,
    Bit1 = 2,
    Bit2 = 4,
    Bit3 = 8,
    Bit4 = 16,
    Bit5 = 32,
    Bit6 = 64,
    Bit7 = 128
}    

Во время выполнения я создаю список экземпляров типа CXIOByte (инкапсулированный в классе, где экземпляр CXIOByte называется Value)и они представлены в моем XAML в виде набора флажков:

ListBox ItemsSource="{Binding InputItems}">
<ListBox.ItemTemplate>
    <DataTemplate DataType="models:CXInputOutputModel">
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit0}}" Margin="5"/>
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit1}}" Margin="5"/>
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit2}}" Margin="5"/>
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit3}}" Margin="5"/>
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit4}}" Margin="5"/>
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit5}}" Margin="5"/>
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit6}}" Margin="5"/>
            <CheckBox IsChecked="{Binding Path=Value, Converter={StaticResource enumBitfieldValueConverterI}, ConverterParameter={x:Static models:CXIOByte.Bit7}}" Margin="5"/>
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>

У меня есть IValueConverter, который помогает оценить состояние «проверено» отдельного бита в поле:

public class EnumBitfieldValueConverter : IValueConverter
{
    private int targetValue;

    public EnumBitfieldValueConverter()
    {
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        int mask = (int)parameter;
        targetValue = (int)value;

        return ((mask & targetValue) != 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        targetValue ^= (int)parameter;
        return Enum.Parse(targetType, targetValue.ToString());

    }
}

Экземпляр этого IValueConverter отслеживает значение времени выполнения, используя внутреннее свойство 'targetValue'.

Теперь это прекрасно работает для одного InputItem в ListView. Но если у меня есть несколько InputItem в ListView, я требую, чтобы каждый элемент использовал свой собственный экземпляр IValueConverter. В противном случае каждый элемент мешает targetValue предыдущего элемента.

Есть ли способ сделать это?

1 Ответ

2 голосов
/ 18 октября 2019

объявляет конвертер как нераспределенный. Ресурс:

<local:EnumBitfieldValueConverter x:Key="enumBitfieldValueConverterI" x:Shared="False">

{StaticResource} будет возвращать новый экземпляр каждый раз

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