为ListBoxItem的内容

时间:2017-03-01 18:41:08

标签: c# wpf xaml listbox listboxitem

我正在试图弄清楚如何绑定ListBoxItems的List并在我的控件上显示正确的DisplayMemberPath。我需要使用ListBoxItems列表,因为我的控件正在访问诸如ActualHeight / Width之类的属性,如果我将ItemsSource绑定到State of List

,我将失去这些属性
public class State
{
    public string LongName { get; set; }
    public string ShortName { get; set; }
}

我有一个AllItems,一个State of List。我按如下方式填充ListBox的ItemsSource:

BoxItems = new ObservableCollection<MyListBoxItem>(AllItems.Select(i => new MyListBoxItem() { Content = i }).ToList());

我希望我的DisplayMemberPath是LongName。我已经尝试了许多不同的方法来修改.xaml以正确显示LongName(纽约,新泽西,佛罗里达等),但我总是在我的列表框中使用namespace.classname。我试图在.xaml和.xaml.cs中设置ListBox的DisplayMemberPath和ItemsSource。

我尝试了很多不同的东西,例如设置内容控件和在.xaml中添加数据模板。

2 个答案:

答案 0 :(得分:1)

创建ObservableCollection<MyListBoxItem>似乎没有意义。

更好地直接绑定到AllItems

<ListBox ItemsSource="{Binding AllItems}"
         DisplayMemberPath="LongName"/>

您可以设置DisplayMemberPath属性:

,而不是设置ItemTemplate
<ListBox ItemsSource="{Binding AllItems}">
    <ListBox.ItemTemplate>
         <DataTemplate>
             <TextBlock Text="{Binding LongName}"/>
         </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:0)

DisplayMemberPath是指T的{​​{1}} ItemsSource中IEnumerable<T>类型的属性。因此,如果您将ListBox设置为ItemsSource,则ObservableCollection<MyListBoxItem>类必须具有MyListBoxItem属性才能设置LongName属于&#34; LongName&#34;。

  

我需要使用ListBoxItems列表,因为我的控件正在访问诸如ActualHeight / Width之类的属性,如果我将ItemsSource绑定到State of List,我将失去这些属性。

您添加到DisplayMemberPath / Items属性中的不是ItemsSource的任何项都隐式包含在ListBoxItem容器中。您可以使用ListBoxItem的{​​{1}}属性设置此属性的任何属性。这意味着您可以将ItemContainerStyleListBox属性添加到Height类并绑定到这些属性,前提是您将Width设置为State

ItemsSource

使用IEnumerable<State>后,您还可以在加载后获得此类容器的引用:

<ListBox x:Name="lb" ItemsSource="{Binding AllItems}" DisplayMemberPath="LongName" Loaded="ListBox_Loaded">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Height" Value="{Binding Height}" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

将ItemsSource设置为ItemContainerGenerator并不是一个好主意。