Я определил следующее перечисление для представления битового поля в моей программе:
[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 предыдущего элемента.
Есть ли способ сделать это?