将ItemsSource中元素的属性绑定到标签内容

时间:2015-11-24 14:08:34

标签: c# wpf xaml binding

我已经创建了自己的UserControl。此控件具有类型为ItemsSource的属性Dictionary<string, object>。 Key - 它是我绑定到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。

public class 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));
        }
    }

}

但这是好的解决方案吗?从表现方面来看。感谢

1 个答案:

答案 0 :(得分:0)

您必须设置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>