2012-09-05 57 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

相關問題