雖然可以使用這種一個ObservableCollection,這取決於如何使用它,你將不會從它recive任何中獲益, ObservableCollection的關鍵特性是它實現INotifyCollectionChanged。這個接口做的是提供一個通知機制來告訴UI屬性已經改變。因爲ObservableCollection已經實現了這個功能,所以如果你將DataGrid,ListBox,ItemsControl等的ItemSource屬性綁定到這個類型的集合上,它會在任何時候添加/刪除/替換/移動/重置時自動更新UI。因此,每次要使用新的IEnumerable結果集更新集合時,都必須先清除集合,然後添加新結果。
但是,在這種情況下,我建議通過ObservableCollection來推薦另一個選項。它是使用一種稱爲ObjectDataProvider的東西。使用這個我們可以完全避免背後的代碼,並且總體來說更乾淨。因此,我們有我們的地方服務,在這種情況下,我Window.xaml.cs
public class TranslationService
{
public IEnumerable<string> Translate(string s)
{
return s.ToCharArray().Select(c => c.ToString());
}
}
像你描述的服務,它需要一個字符串從一個文本框,並返回一個IEnumerable。現在,在XAML中,我們可以使用此服務並調用它。
在窗口declerations,我們增加了在服務所在的命名空間:現在
xmlns:local="clr-namespace:WpfApplication4"
,我們Window.Resources(或者用戶控件,或其他任何地方),我們可以參考我們的服務。一旦我們將我們的服務公開爲資源,我們就可以創建一個ObjectDataProvider來公開我們希望使用的Translate方法。
<Window.Resources>
<local:TranslationService x:Key="MyTranslationService" />
<ObjectDataProvider x:Key="MyProvider"
ObjectInstance="{StaticResource MyTranslationService}"
MethodName="Translate">
<ObjectDataProvider.MethodParameters>
""
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
ObjectDataProvider被鍵入我們的服務並使用String參數調用Translate方法。現在我們所要做的就是讓它響應我們的文本框。
我們可以通過使用一些綁定屬性來做到這一點。我們希望TextBox中的TextProperty綁定到ObjectDataProvider,因此我們將Source屬性設置爲指向它。我們要綁定到的PathData中的ObjectDataProvider部分是MethodParameter。現在,我們將其設置爲直接綁定到該屬性的源,並且僅以單向方式傳送,這意味着ObjectDataProvider的方法參數不會更新文本框的文本。最後,我們可以將UpdateSourceTrigger設置爲PropertyChanged,告訴綁定在對象數據提供程序中設置我們綁定的源,只要文本發生任何更改。
<StackPanel>
<TextBox TextChanged="OnTextChanged"
Text="{Binding Source={StaticResource MyProvider}, Path=MethodParameters[0], BindsDirectlyToSource=True, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}" />
<ListBox ItemsSource="{Binding Source={StaticResource MyProvider}}" />
</StackPanel>
剩下的就是在網格中設置ItemsSource,或者在這種情況下設置一個簡單的ListBox。
關於對DataGrid中的最後一部分: 如果您使用的是WPFToolkit的數據網格,它有一個自動生成功能,可以通過屬性進行設置,你可以在它身上找到here更多信息。
看起來這裏有一些很好的閱讀。現在沒有時間檢查它們,但是在我有了之後會回來。 – 2009-05-20 07:19:42