1

我对一些 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 中正确创建引用以myStrings在 cboItem ComboBox 中显示列表?一旦我知道了这一点,我就可以开始详细了解数据绑定概念,但是现在,我需要有人为我解释一些非常基本的事情,比如“我如何告诉 XAML 在哪里查找数据?”

4

1 回答 1

1

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

WPF 对象在它们的DataContext. 这是每个 WPF 框架元素的属性,并且会“级联”下来,因此设置DataContextWindow意味着该窗口上的每个控件也将继承相同的DataContext. 但是,它们不必使用相同的上下文。每个控件都可以通过设置其DataContext属性来设置自己的上下文。

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

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

<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>

DataContext行告诉 WPF 为它的绑定查看哪个对象,并且该ItemsSource行告诉组合在其字符串列表的上下文中使用哪个属性。

编辑:要在组合上设置 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">
    <Grid>
        <ComboBox Margin="0,10,0,0"
                  x:Name="cboItem" 
                  TabIndex="1"
                  DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}"
                  ItemsSource="{Binding myStrings}"/>
    </Grid>
</Window>
于 2012-09-05T09:25:49.787 回答