這是我第一次發佈到stackoverflow,所以如果我做了任何錯誤,我很抱歉。我有一個利用Prism和MVVM模式的WPF應用程序。在我看來,我有一個具有自定義數據模板的TabControl,並綁定到名爲ShippingLabel的類的ObservableCollection。如何從後臺工作人員更新綁定到選項卡控件的圖像集合?
的XAML TabControl的:
<TabControl Grid.Row="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemsSource="{Binding Path=ShippingLabels}">
<TabControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Path=Name}"/>
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Path=Image}"/>
</StackPanel>
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
我創建綁定到TabControl
public class ShippingLabel
{
/// <summary>
/// Name of the image, this is the text that will be displayed in the Tab
/// </summary>
public string Name { get; set; }
/// <summary>
/// BitmapImage to display for TabContent
/// </summary>
public BitmapImage Image { get; set; }
}
最初我是做所有需要在我的ViewModel的構造函數中完成的工作
Helper類中, ViewModel調用WCF服務並獲取包含以base64編碼的字符串格式傳送標籤的響應。這工作得很好,標籤顯示正確,基於他們表示他們正在運送的包裹的數量。爲了提高可用性,我決定添加一個BackgroundWorker來處理調用服務並在工作人員完成後處理運輸標籤。
BackgroundWorker的事件
private void serviceWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Present the shipping labels
ShippingLabels = new ObservableCollection<ShippingLabel>();
int packageNumber = 0;
foreach (var result in adapter.CurrentResponse.PackageResults)
{
packageNumber++;
Byte[] labelBytes = new Byte[result.ShippingLabel.Length];
labelBytes = Convert.FromBase64String(result.ShippingLabel.Replace("\r\n", "").Replace(" ", ""));
var tempLabel = new BitmapImage();
tempLabel.BeginInit();
tempLabel.StreamSource = new MemoryStream(labelBytes);
tempLabel.Rotation = Rotation.Rotate90;
tempLabel.EndInit();
ShippingLabels.Add(new ShippingLabel()
{
Name = "Package " + packageNumber.ToString(),
Image = tempLabel
});
}
ShowBusyIndicator = false;
RaisePropertyChanged(() => ShippingLabels);
}
private void serviceWorker_DoWork(object sender, DoWorkEventArgs e)
{
adapter.ProcessShipment();
}
然而,當我嘗試這個用戶界面將只與名稱顯示的標籤,但標籤內容沒有圖像。我試圖讓我的課支持INotifyPropertyChanged認爲它是那裏的東西,但這沒有什麼區別。所以問題是需要做什麼才能正確通知UI集合的Image屬性已更改,以便它將更新?
當我在RunWorkerCompleted方法中放置一個斷點時,我可以看到新的ShippingLabel類被添加到集合中,所以我不這麼認爲。 – Jeremie 2011-04-05 16:32:38