C# 为每个ListBox项实例化ValueConverter的新实例

C# 为每个ListBox项实例化ValueConverter的新实例,c#,wpf,xaml,ivalueconverter,C#,Wpf,Xaml,Ivalueconverter,我已定义以下枚举来表示程序中的位字段: [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中表示为

我已定义以下枚举来表示程序中的位字段:

[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的实例使用内部“targetValue”属性跟踪运行时值

现在,这对于ListView中的单个InputItem很好。但是,如果在ListView中有多个InputItem,则需要每个项使用其自己的IValueConverter实例。否则,每个项目都会与上一个项目的目标值发生冲突


有没有办法做到这一点?

将转换器声明为非共享资源:

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


{StaticResource}
每次都将返回新实例

将转换器声明为非共享资源:

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


{StaticResource}
每次都将返回新实例

中创建值转换器作为资源。在
中创建值转换器作为资源。我需要研究一下,以便更好地理解。但是你的回答被证实是有效的。当我开始键入x时:。。。我没有把“共享”作为智能感知选项。我只得到了“FieldModifier”、“Key”、“Name”和“Uid”。然而,不管怎样输入它仍然被编译器接受。我需要研究一下,以便更好地理解它。但是你的回答被证实是有效的。当我开始键入x时:。。。我没有把“共享”作为智能感知选项。我只得到了“FieldModifier”、“Key”、“Name”和“Uid”。然而,不管怎样输入它仍然被编译器接受。