2011-04-05 36 views
0

這是我第一次發佈到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屬性已更改,以便它將更新?

回答

1

由於您注意到顯示標籤的名稱,因此這可能與圖像本身非常相關。綁定看起來很好。

如果您的圖像是在後臺工作人員上創建的,您必須非常小心,BitmapImage具有線程親和性,並且它相對於load one in the background更復雜,需要將其凍結才能轉回。

您確定沒有任何異常被某個後臺工作人員吞下嗎?

+0

當我在RunWorkerCompleted方法中放置一個斷點時,我可以看到新的ShippingLabel類被添加到集合中,所以我不這麼認爲。 – Jeremie 2011-04-05 16:32:38