2012-09-05 31 views
1

我在WPF控件上做了一些维护工作,这些我都不太熟悉,而且我正在为WPF中的一些基础工作挣扎。在XAML窗口的组合框中显示类项目

我有下面的代码,我的理解是被称为“代码隐藏”:

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的东西,它定义了一个十分可怕的组合框。

<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组合框的myStrings列表参考?一旦我知道了,我可以开始理解databinding concepts in detail,但现在,我需要有人为我解释真正基本的东西,比如“如何告诉XAML在哪里查找数据?”

回答

1

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

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

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

然而,随着你的榜样去,没有什么设置从您的窗口的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> 

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

感谢。尽管如何设置ComboBox本身的DataContext?如果我尝试移植代码并将其写回维护项目中,我会想象将DataContext设置为更高级别会破坏该控件上的所有其他代码。 – Frosty840

+0

已经更新了答案,但如果可能的话,我会尝试使用其他所有内容。黑客入侵代码背后并不是很好。 – GazTheDestroyer

+0

是的,当然,维护项目本身已经被彻底滥用,甚至不会将'''注释作为文档注册。他们只是坐在那里作为评论。我很害怕做任何事情,以至于我无法看到它被固定在任何真正的程度。我在MVVM中有另一个传统的WPF项目,我可以看到它的优点,但这并不是一个更好的状态。它不使用依赖属性,它使用各种奇怪的变通办法来篡改所有内容。基本上,所有这些都已经过去了。尽管如此,我真的很欣赏这些建议。 – Frosty840

相关问题