在XAML窗口的ComboBox中显示类项

时间:2012-09-05 09:08:49

标签: .net wpf vb.net data-binding

我在一些WPF控件上做了一些维护工作,这是我不太熟悉的事情,而且我正在努力解决WPF中的一些基础问题。

我有以下代码,我理解这被称为“代码隐藏”:

Class MainWindow
    Private _myStrings As New List(Of String)({"one", "two", "three", "four", "five"})
    Public Property myStrings As List(Of String)
        Get
            Return _myStrings
        End Get
        Set(value As List(Of String))
            _myStrings = value
        End Set
    End Property
End Class

然后我有了这个WPF的东西,它定义了一个非常难看的ComboBox。

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox Margin="0,10,0,0"
                  x:Name="cboItem" 
                  TabIndex="1"/>
    </Grid>
</Window>

问题:我想知道的是如何在XAML中正确创建引用以在cboItem ComboBox中显示myStrings列表?一旦我知道了,我就可以了解databinding concepts in detail,但是现在,我需要有人为我解释一些基本的东西,比如“如何告诉XAML在哪里查找数据?”

1 个答案:

答案 0 :(得分:1)

ComboBox有一个名为ItemsSource的属性,可以设置为静态字符串列表,或者更常见的是,可以绑定到某些对象列表。

WPF对象在DataContext中查找绑定。这是每个WPF框架元素的属性,并且将“级联”向下,因此设置DataContext的{​​{1}}意味着该窗口上的每个控件也将继承相同的Window。但是,他们 没有使用相同的上下文。每个控件都可以通过设置其DataContext属性来设置自己的上下文。

您已在窗口中定义了字符串列表(在后面的代码中)。这不是很平常。 WPF中使用的一种更常用的方法是定义一个 ViewModel 类,其中包含您的视图所需的所有数据,然后将其设置为DataContext。这就是MVVM模式的全部内容。

但是,按照您的示例,没有什么能阻止您将Window的DataContext设置为Window本身:

DataContext

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}"> <Grid> <ComboBox Margin="0,10,0,0" x:Name="cboItem" TabIndex="1" ItemsSource="{Binding myStrings}"/> </Grid> </Window> 行告诉WPF要查看哪个对象的绑定,DataContext行告诉combo在上下文中使用哪个属性作为其字符串列表。

编辑:要在组合上设置DataContext,您可以这样做:

ItemsSource