gpt4 book ai didi

c# - 具有IEnumerable 作为ItemsSource和SelectedItem异常的ComboBox

转载 作者:行者123 更新时间:2023-12-03 10:24:53 26 4
gpt4 key购买 nike

我将IEnumerable<Brush>用作ItemsSource的ComboBox遇到此问题;问题出在我(以编程方式)尝试设置SelectedItem时。这是描述问题的代码:

private readonly List<Brush> colors_;
private Brush white_;

ViewModelConstructor()
{
colors_ = (from p in brushes_type.GetProperties()
select (Brush)converter.ConvertFromString(p.Name)).ToList();

white_ = colors_.Single(b => b.ToString() == "#FFFFFFFF");
}

public IEnumerable<Brush> Colors
{
get { return colors_; }
}

public Brush White
{
get { return white_; }
set
{
if (white_ != value)
white_ = value;
}
}

这是xaml代码:
<ComboBox ItemsSource="{Binding Path=Colors}"
SelectedItem="{Binding Path=White}">

<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">

<Border BorderThickness="1"
BorderBrush="Black"
Width="20"
Height="12"
SnapsToDevicePixels="True"
Margin="0,0,4,0">

<Border Background="{Binding}"/>

</Border>

<TextBlock Text="{Binding}"/>

</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>

调用get on White属性后,我得到一个异常: 无法在对象'#FFFFFFFF'上设置属性,因为它处于只读状态。如果我将White(white_)保留为null,则一切正常。

最佳答案

使用Reflector,我已经找到了可能出现问题的地方。在Selector.ItemSetIsSelected内部,它采用新的SelectedItem并执行以下操作:

  • 如果元素的容器DependencyObject,则将容器上的IsSelectedProperty设置为true
  • 否则,如果元素DependencyObject,则会将元素上的IsSelectedProperty设置为true

  • 第二部分是失败的根源,您选择的 Brush对象为只读。因为在这种情况下 Selector.ItemSetIsSelected有点破损,所以您有两个选择。

    选项1 ,您只需对从Converter返回的Brush对象上的.Clone()进行调用。
    colors_ = (from p in typeof(Brushes).GetProperties()
    select ((Brush)converter.ConvertFromString(p.Name)).Clone()).ToList();

    编辑:您应该使用选项1 ...选项2是解决问题的漫长方法

    选项2 ,您可以将Brush对象包装成另一个对象:
    public class BrushWrapper
    {
    public Brush Brush { get; set; }
    }

    然后,您更新数据模板路径:
    <Border Background="{Binding Path=Brush}" />


    <TextBlock Text="{Binding Path=Brush}" />

    最后,您更新 ViewModel:
    private readonly List<BrushWrapper> colors_;
    private BrushWrapper white_;

    public ColorViewModel()
    {
    colors_ = (from p in typeof(Brushes).GetProperties()
    select new BrushWrapper {
    Brush = (Brush)converter.ConvertFromString(p.Name)
    }).ToList();

    white_ = colors_.Single(b => b.Brush.ToString() == "#FFFFFFFF");
    }

    public List<BrushWrapper> Colors
    {
    get { return colors_; }
    }

    public BrushWrapper White
    {
    get { return white_; }
    set
    {
    if (white_ != value)
    white_ = value;
    }
    }

    关于c# - 具有IEnumerable <Brush>作为ItemsSource和SelectedItem异常的ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1595471/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com