将字符串观察者集合绑定到组合框

时间:2012-11-29 07:26:21

标签: c# wpf xaml

我可以从这里找到同样的问题。我尝试了所有方法。但他们都没有解决我的问题。所以请不要将其标记为重复。

这就是我想要做的。我有一个字符串列表,我想将列表项绑定到组合框。

可以请任何人帮助我找到我在这里做的错误。

XAML

<ComboBox Name="comboBox1" ItemsSource="{Binding AvailableTypes}" DataContext="{Binding AvailableTypes}"/>  

.cs文件

    ObservableCollection<string> availableTypes = new ObservableCollection<string>();

    public ObservableCollection<string> AvailableTypes { get { return availableTypes ; } }

    public Window1()
    {            
        InitializeComponent();
        availablePayTypes.Add("Type1");  
        availablePayTypes.Add("Type1");           
    }  

数据不会绑定到组合框。如果我这样做,它的工作原理。

comboBox1.ItemsSource=AvailableTypes;  

我的代码有什么问题。请帮我。

谢谢。

2 个答案:

答案 0 :(得分:2)

至少有两件事是错的。首先,您有一个拼写错误 - ItemsSource="{Binding AvailablePayTypes}"应该是AvailableTypes以匹配媒体资源名称。

其次,您无需同时设置DataContextItemsSource。通常,您将XAML根的DataContext设置为代码隐藏类,然后使用ItemsSource="{Binding AvailableTypes}"

请注意,您可以从代码隐藏设置DataContext:

public Window1()
{            
    InitializeComponent();
    availablePayTypes.Add("Type1");  
    availablePayTypes.Add("Type1");           
    LayoutRoot.DataContext = this;
}  

或者使用RelativeSource来自XAML本身:

<UserControl
    DataContext="{Binding RelativeSource={RelativeSource Self}}" />

答案 1 :(得分:1)

DataContext和ItemsSource绑定的组合不正确。

这将有效:

<ComboBox Name="comboBox1" ItemsSource="{Binding AvailableTypes}" /> 

在你的构造函数中:

public Window1()
{            
    InitializeComponent();
    DataContext = this; // <--
    availablePayTypes.Add("Type1");  
    availablePayTypes.Add("Type1");           
}  

这里发生了什么?

  1. 当集合名为AvailablePayTypes时,您绑定到AvailableTypes
  2. 您正在将DataContext绑定到AvailablePayTypes。但这不起作用,因为您的Window本身没有DataContext集,因此WPF不知道在哪里查找AvailablePayTypes
  3. 您正在将ItemsSource绑定到AvailablePayTypes。即使DataContext的先前绑定有效,WPF现在也会在集合AvailablePayTypes上查找名为AvailablePayTypes的属性。这显然是错误的。
  4. 我对您的代码进行了以下更改:

    1. 修正了拼写错误
    2. 删除了ComboBox的DataContext的绑定,以便从Window继承它
    3. 在Window的构造函数中,我将DataContext设置为自身。