将数据绑定到ComboBox WPF

时间:2011-10-24 03:18:15

标签: wpf

我是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;
}

但它不会有效,请帮忙吗?

3 个答案:

答案 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; 
    }