2011-03-28 175 views
5

我在我的WPF應用程序中有一個Datagrid控件,我試圖將該控件綁定到我的主窗口類中的ObservableCollection屬性。我想綁定到財產的定義是:WPF ItemsSource綁定

private ObservableCollection<RequestResult> m_SentRequests = new ObservableCollection<RequestResult>(); 
public ObservableCollection<RequestResult> SentRequests { get { return m_SentRequests; } } 

我的DataGrid是一組由具有在DataContext設置到主窗口:

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" Margin="0,305,0,0" Name="grpResults" VerticalAlignment="Top" Width="712" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1}}"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Margin="6,6,6,0" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" DataContext="{Binding}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 

的問題我有是在屬性窗口中,在選擇SentRequests作爲我的ItemsSource之後,我仍然無法選擇「編輯屬性綁定列」選項。我得到一個「您必須先設置ItemsSource,然後才能執行此操作」對話框。選擇「生成列」和「刪除列」時出現相同的錯誤。就好像我沒有在ItemsSource屬性中爲我的對話框設置任何東西。

雖然我可以將AutoGenerateColumns設置爲true,但我發現我的數據已經綁定(但是不是與我想要顯示的列)。

我對WPF很陌生,我只是寫這個測試Windows服務的快速測試應用程序。

任何人知道我在做什麼錯在這裏?

+0

DataGrid中的'DataContext =「{Binding}」'是多餘的,我想,因爲通常DataContext被繼承。 – 2011-03-28 19:48:05

+0

@ H.B。謝謝,我做了清理。它沒有什麼區別(不是你期望的)。可能是我嘗試多件事的一個神器。 – Redbaran 2011-03-28 20:03:08

回答

1

您是否嘗試過沒有DataContext標籤?在GroupBox和DataGrid中。

編輯

是這樣的:

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" > 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 
+0

我不確定你的意思,你能更具體嗎?現在,XAML標記是由Visual Studio生成的。 – Redbaran 2011-03-28 19:46:28

+0

丹尼爾,那不行。如果沒有設置datacontext,我的屬性上的get不會再被調用,也不允許我使用Properties窗口來編輯列。 – Redbaran 2011-03-28 20:04:05

2

這可能是一些掛羊頭賣狗肉的結果,設計師確實呈現不經常編譯(如跳繩代碼隱藏構造函數)。嘗試將你的集合移動到一個單獨的類,並使用它的一個實例作爲你的DataContext(如MVVM ViewModel)。其他類應該能夠正常初始化並向設計者提供綁定屬性。

3

我不相信你需要itemSource中的Path參數。你應該能夠只設定爲的ItemsSource = {結合SentRequests}綁定

您也可以綁定到網格項目源,例如代碼,如果我創建一個虛擬集合:

public class People 
{ 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Age { get; set; } 
    public string address { get; set; } 
    public string zip { get; set; } 
} 

,然後填充它

this.AllPeople = new ObservableCollection<People>(); 


     private void FillData() 
    { 
     People p1 = new People(); 
     p1.FirstName = "John"; 
     p1.LastName = "Doe"; 
     p1.Age = "24"; 
     p1.address = "123 Main Street"; 
     p1.zip = "11111"; 

     People p2 = new People(); 
     p2.FirstName = "Jane"; 
     p2.LastName = "Smith"; 
     p2.Age = "36"; 
     p2.address = "456 Water Street"; 
     p2.zip = "22222"; 

     People p3 = new People(); 
     p3.FirstName = "Larry"; 
     p3.LastName = "Williams"; 
     p3.Age = "24"; 
     p3.address = "785 Water Street"; 
     p3.zip = "33333"; 

     this.AllPeople.Add(p1); 
     this.AllPeople.Add(p2); 
     this.AllPeople.Add(p3); 
    } 

我可以然後設置在炫魅contsructor或方法的項目源:

this.gridviewname.ItemsSource = 「AllPeople」;

+0

它也可以在設計師中使用嗎? – 2011-05-10 17:33:13

+0

你能解釋一下設計師的意思嗎?你是指綁定?如果是這樣,那麼是將項目源設置爲集合,你應該很好去。 – rlcrews 2011-05-10 19:24:14