我在一些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在哪里查找数据?”
答案 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