2013-03-29 126 views
4

我有一個ObservableCollection<IRuleCondition>,我想顯示 - 在IRuleCondition接口用於通過2個不同的類我想顯示,一個RuleCondition簡單地顯示一個規則的條件(信息,例如優先級,屬性來檢查等上),和一個RuleConditionGroup,可以包含2個或更多RuleConditions,以這樣的方式,任何條件可以匹配分組,或全部等WPF和的ObservableCollection <T>

在我想知道XAML是有顯示不同的方式ListView.ItemTemplate取決於它在ObservableCollection<IRuleCondition>中遇到的類型?或者我是否需要實施兩種不同的ObservableCollection

+0

DataTemplate可能會解決您的問題 –

回答

9

這裏是如何工作的

這是怎樣的對象定義

public interface Person 
{ 
    string Name { get; set; } 
} 

public class Manager : Person 
{ 
    public string Name { get; set; } 
} 

public class Employee : Person 
{ 
    public string Name { get; set; } 
    public string ManagerName { get;set;} 
} 

這背後

public partial class MainWindow : Window 
    { 
     ObservableCollection<Person> mPeople = new ObservableCollection<Person>(); 

     public ObservableCollection<Person> People 
     { 
      get 
      { 
       return mPeople; 
      } 
     } 

     public MainWindow() 
     { 
      DataContext = this; 
      mPeople.Add(new Employee{ Name = "x" , ManagerName = "foo"}); 
      mPeople.Add(new Manager { Name = "y"}); 

      InitializeComponent(); 
     } 
    } 

這在主窗口的代碼是主窗口XAML

一個簡單的例子
<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:my="clr-namespace:WpfApplication1" 
     Title="MainWindow" 
     Height="350" 
     Width="525"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type my:Employee}"> 
      <StackPanel Background="Green" Width="300"> 
       <TextBlock Text="{Binding Name}" /> 
       <TextBlock Text="{Binding ManagerName}" /> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type my:Manager}"> 
      <StackPanel Background="Red" 
         Width="300"> 
       <TextBlock Text="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 

    </Window.Resources> 
    <Grid> 
     <ListBox ItemsSource="{Binding People}"></ListBox> 
    </Grid> 
</Window> 

正如你可以看到有兩個的DataTemplates一個經理,一個用於員工

enter image description here

這是蹩腳的輸出的樣子。注意爲員工顯示的綠色和紅色背景和額外字段與經理相比

+0

試圖這樣做,但每次我嘗試並啓動它時,它說 '失敗從文本'local:EditableRuleConditionModel'創建'Type'。行號「13」和行位置「53」。 但是intellisense正在拿起我的班級名稱等:S – KingTravisG

+0

嘗試打開所有例外,並觀察輸出窗口的綁定失敗 –

+0

現在嘗試 - 由於某種原因,當我將所有DataTemplate資源從資源文件它的主要.xaml文件工作沒有問題! – KingTravisG

2

只需在Resources部分定義兩個不同的DataTemplates,每個RuleCondition類型一個。

+0

我在資源文件中已經有類似內容,但我不知道如何去切換它們 - 我一直在使用這個例子,但由於某種原因,我不斷從我的DataTemplateSelector類中獲取「無法創建未知類型」 – KingTravisG

+0

http://msdn.microsoft.com/en-us/library/ms742521.aspx 對不起,忘記了我一直使用的樣品的鏈接! – KingTravisG

1

1)創建你的兩個不同的數據模板,就像你說你已經完成了一樣。 2)創建一個自定義DataTemplateSelector來選擇適當的模板。

您的一條評論指出您從DataTemplateSelector中收到錯誤。驗證您是否正確實施了該類,可能會粘貼您的實施。它應該相當小和直接。

+0

是啊,算出了什麼是錯的,ResourceFile需要設置爲「頁面」才能正常工作,感謝您的幫助:) – KingTravisG

相關問題