2011-10-07 44 views
2

我新的WPF所以請原諒我,如果我錯過了一些東西明顯我如何控件綁定到一個WPF的ListView列

我有以下的列表視圖控件(非培訓相關細節簡潔,刪除)

<ListView> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Type}"/> 
     <GridViewColumn Header="Details" DisplayMemberBinding="{Binding Details}"/> 
    </GridView> 
    </ListView.View> 
</ListView> 

我將項目添加到這個列表視圖代碼後面

public void Add(LogEntry entry) 
{ 
    ListViewItem item = new ListViewItem(); 
    item.Content = entry; 
    listView.Items.Add(item); 
} 

其中LogEntry是否有「類型」和「詳細信息」

公共字符串屬性

到目前爲止,一切都很好,一切工作可愛的,但.. 我希望我的細節屬性是元素本身(文本框或包含各種類型的內容DockPanel中) 我如何可以綁定這個元素的列表列?

使用上面的代碼,更改「詳細信息」的元素,我只是得到列表框中(如System.Windows.Control.TextBox)類名作爲默認的單元格顯示屬性的ToString()值。 我已經使用了一個DataTemplate的例子,但我找不到將元素綁定到面板內容的示例。 控制不能在XAML被定義爲它的結構和內容是未知的,直到運行時

綁定是單程(I只需要顯示的列表中,不更新所述基本數據結構)

爲了使我問題更清楚,我想下面的列表項綁定

class LogEntry 
{ 
    public string Type {get;} 
    public DockPanel Details {get;} // This dock panel was created by code and contains 
            // various elements not predictable at compile time 
} 

回答

0

模型中,LogEntry類,不應引用UI控件。相反,它應該包含UI所需的數據,並且XAML應該定義一個使用該數據的DataTemplate。例如,

public class LogEntry 
{ 
    public string Type {get;} 
    public ObservableCollection<IDetail> Details {get;} 
} 

<DataGridTemplateColumn Header="Details"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <DockPanel> 
       <ItemsControl ItemsSource="{Binding Details}" /> 
      </DockPanel> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

您在不運行時知道的LogEntry創建項目提到DockPanel中。你能舉一個例子嗎?在大多數情況下,數據中應該有某種模式,並且您可以使用DataTemplates來定義如何繪製每個細節。

<DataTemplate DataType="{x:Type local:LoginDetail}}"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding CreatedDate}" /> 
     <TextBlock Text="{Binding UserName}" /> 
     <TextBlock Text="{Binding MachineLoggedIn}" /> 
    </StackPanel> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:LogoutDetail}}"> 
    <StackPanel Orientation="Horizontal"> 
     <TextBlock Text="{Binding CreatedDate}" /> 
     <TextBlock Text="{Binding UserName}" /> 
     <TextBlock Text="{Binding LoggedInTime}" /> 
    </StackPanel> 
</DataTemplate> 

如果你真的需要存儲在模型中的控制,那麼您可以在您的DataGridTemplateColumn使用ContentControl,並設置它的Content等於詳情

<ContentControl Content="{Binding Details}" /> 
+0

我同意你的回答。綁定到模型的控件是一種不好的做法。道教應該使用'DataTemplates'和'DataTemplateSelector'在運行時決定正確的模板。 –

+0

由於雷切爾,這正是我一直在尋找 有問題的數據是XML,可以包含文本和/或對象條目的列表。現在,我可以綁定是在面板的內容,我可以考慮模板選擇,對各類物體(該項目仍處於早期階段,因此也許以後...) – Taoist

+0

@Taoist WPF實際上可以綁定到XML中的相同它會綁定到一個類,所以也許你可以使用它來獲得你的優勢。 – Rachel

0

對不起,我不能給你一個確切的答案,因爲我沒有VS在那裏我現在在這裏,但有幾個指針。

首先,不要使用你的方法來添加Listview項目,你想創建一個ObservableCollection與你的數據。然後,您可以將listview的itemssource綁定到observableCollection。

接下來,您可以爲包含您想要的控件的listview創建一個itemtemplate,一些非常簡單的東西就像一個帶有水平方向和兩個文本框的堆棧面板。

一旦你這樣做了,因爲你已經將listview的itemsource設置爲ObservableCollection,你可以將文本框綁定到你的集合中的String屬性。

請注意,ObservableCollection比List更好,因爲ObservableCollection支持NotifyPropertyChanged()。

+0

感謝您的答覆 我沒考慮在你建議的方式結合的項目,但我執行add函數條件突出顯示的一點點(省略因爲它不會影響我在我的問題) 我增加多一點的問題希望讓我的問題更清楚。 – Taoist

+0

沒問題,如果沒有人回答,我會試試看,當我回家,看看我能否給你一個答案。關於條件格式的問題,儘管你可以使用我提到的使用樣式和觸發器的綁定方法來實現這一點。 – Purplegoldfish

0

我已將您的代碼複製到一個新項目中,並在此處創建了相同的列表視圖。而這一工作,並正確顯示數據

XAML:

<ListView x:Name="MyList" ItemsSource="{Binding MyListDetails}"> 
    <ListView.View> 
     <GridView> 
     <GridViewColumn Header="Type" DisplayMemberBinding="{Binding Firstname}"/> 
     <GridViewColumn Header="Details" DisplayMemberBinding="{Binding Lastname}"/> 
     </GridView> 
</ListView.View> 

視圖模型:

private List<Contact> _details= new List<Contact>();; 
    public List<Contact> MyListDetails 
    { 
     get 
     { 
      return _details; 
     } 
     set 
     { 
      _details = value; 
      this.RaisePropertyChanged("MyListDetails"); 
     } 
    } 

public void AddEntry(LogEntry entry) 
{ 
    MyListDetails.Add(entry); 
} 
+0

感謝您的答覆 我也有過這樣用繩子性質 工作你現在可以使其與我的問題的底部在類設置爲元素,如列表項屬性中的一個工作嗎? 這是我遇到的問題 – Taoist

+0

這可以通過FrameworkElement綁定完成。 –