我是WPF的新手,需要帮助将数据绑定到ComboBox。 xaml文件包含以下标记。
<UserControl x:Class="SKAT.Postfordeler.Client.UI.View.ChooseInboxView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="42" d:DesignWidth="598">
<Grid>
<StackPanel Orientation="Horizontal">
<ComboBox Name="_currentInbox" Width="180" Margin="5" Height="22" DataContext="{Binding}" />
<Label Content="Et job kører allerede i denne indbakke (1500 ud af 1700 poster behandlet)" Name="_currentProcess" Margin="5" Height="25" />
</StackPanel>
</Grid>
//Inbox class , this class was implemented in seperate project
namespace SKAT.Postfordeler.Shared.DataTypes
{
[DataContract]
public class Inbox
{
[DataMember]
public String Id { get; set; }
[DataMember]
public String Folder { get; set; }
[DataMember]
public Rule Rules { get; set; }
}
}
//This code is located in the controller, the Activate method will fire when the MainWindow was executed
public void Activate()
{
var configuration = _configurationManager.GetConfiguration();// this method gets the xaml file settings
_chooseInboxView.FillInboxes(configuration.Inboxes); // Inboxes data binds to combobox
}
在后面的View代码中,我创建了一个绑定包含列表类型
的数据的方法public void FillInboxes(List<Inbox> inboxes)
{
DataContext = inboxes;
}
但它不会有效,请帮忙吗?
答案 0 :(得分:2)
我假设您的Inbox
类包含两个属性(为简单起见),但可能有任意数量:
public class Inbox
{
public int ID { get; set; }
public string Text { get; set; }
}
你写了一个DataTemplate
,例如:
<Grid.Resources>
<DataTemplate x:Key="InboxTemplate">
<WrapPanel>
<TextBlock Text="{Binding Path=ID}"/>
<TextBlock>:</TextBlock>
<TextBlock Text="{Binding Path=Text}"/>
</WrapPanel>
</DataTemplate>
</Grid.Resources>
然后更正您的ComboBox声明,如:
<ComboBox Name="_currentInbox" Width="180" Margin="5" Height="22" ItemsSource="{Binding}" ItemTemplate="{StaticResource InboxTemplate}" />
最后,您将ComboBox的DataContext
设置为List<Inbox>
:
public void FillInboxes(List<Inbox> inboxes)
{
_currentInbox.DataContext = inboxes;
}
编辑:由于您要求提供更简单的解决方案,您可以覆盖ToString()
类的Inbox
方法:
protected override string ToString()
{
return ID.ToString() + ":" + Text;
}
答案 1 :(得分:2)
而不是DataContext={Binding}
您应该ItemsSource={Binding}
。
可视化树中任何frameworkelement的数据上下文默认为{Binding}
。
<ComboBox Name="_currentInbox"
SelectedItem="Hoved"
Width="180"
Margin="5"
Height="22"
DisplayMemberPath="Name"
ItemSource="{Binding}" />
另外,对于组合框来正确显示项目的文本,我想你也需要DisplayMemberPath
。我假设您需要显示Inbox
类的属性为Name
。请替换您的相关财产名称。
答案 2 :(得分:2)
如果您的收件箱类似,
public class Inbox
{
public int ID { get; set; }
public string Text { get; set; }
}
如果你不想改变你的xmal,方法背后的代码应该是这样的,
public void FillInboxes(List<Inbox> inboxes)
{
_currentInbox.DisplayMemberPath = "Text"; // To display the 'Text' property in the combobox dropdown
//_currentInbox.DisplayMemberPath = "ID"; // To display the 'ID' property in the combobox dropdown
_currentInbox.DataContext = inboxes;
}