我正在试图弄清楚如何绑定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中添加数据模板。
答案 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}}属性设置此属性的任何属性。这意味着您可以将ItemContainerStyle
和ListBox
属性添加到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
并不是一个好主意。