这是我在 stackoverflow 上的第一篇文章,所以如果我做错了什么,我深表歉意。我有一个使用 Prism 和 MVVM 模式的 WPF 应用程序。在我看来,我有一个 TabControl,它有一个自定义数据模板并绑定到一个名为 ShippingLabel 的类的 ObservableCollection。
TabControl 的 Xaml:
<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 的构造函数中完成所有需要完成的工作,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();
}
但是,当我尝试此操作时,UI 将仅显示带有名称的选项卡,但选项卡内容中没有图像。我试图让我的班级支持 INotifyPropertyChanged 认为它在那里但没有任何区别。所以问题是需要做什么才能正确通知 UI 集合的 Image 属性已更改以便更新?