我创建了自己的UserControl。该控件具有类型为ItemsSource的自己的属性Dictionary<string, object>。关键-它是我绑定到ItemsSource的集合中元素的标题。

是否可以访问ItemsSource的任何属性,而无需将其值分别添加到ItemsSource(不要转换为List<Tuple<string, string, object>>



public class Book
{
   public int Id{get;set}
   public string Title{get;set;}
   public string Description{get;set;}
}

var list = new List<Book>(){//initializing};
userControl.ItemsSource = list.ToDictionary(i => i.Title, i => i);


因此,如果我只有Description,我想访问ItemsSource。可能吗?



我的UserControl与此处写的相同MultipleComboBox

我像这样绑定ItemsSource:

<controls:MultiSelectComboBox SelectedItems="{Binding SelectedBooks, Mode=TwoWay}" x:Name="Books" DefaultText="Category" ItemsSource="{Binding Books}"/>




我可以想象的解决方案-将属性添加到类Node,该类将使用ItemsSource的Value属性进行初始化。之后,像Value.Description一样绑定。

公共类Node:INotifyPropertyChanged
    {

    private string _title;
    private object _value;
    private bool _isSelected;
    #region ctor
    public Node(string title, object value)
    {
        Title = title;
        Value = value;
    }
    #endregion

    #region Properties
    public string Title
    {
        get
        {
            return _title;
        }
        set
        {
            _title = value;
            NotifyPropertyChanged("Title");
        }
    }

    public object Value
    {
        get { return _value; }
        set
        {
            _value = value;
            NotifyPropertyChanged("Value");
        }
    }

    public bool IsSelected
    {
        get
        {
            return _isSelected;
        }
        set
        {
            _isSelected = value;
            NotifyPropertyChanged("IsSelected");
        }
    }
    #endregion

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

}


但这是一个好的解决方案吗?从性能方面。谢谢

最佳答案

您必须设置ItemTemplate

<ComboBox ItemsSource="{Binding Books}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Key}"/>
                <TextBlock Text="{Binding Value.Description}"/>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

10-01 03:16
查看更多