c# - 将对象属性转换为不同的可视对象

标签 c# wpf mvvm inversion-of-control ivalueconverter

假设我有一个看起来像这样的对象图(这不是我的真实对象):

CaseFile
- Sections (collection)
  - Documents (collection of type:Document)
- Other Node
  - Other Children (collection)
    - More children (collection)

我想在“TreeView”中呈现这些数据。我正在使用 HierarchicalDataTemplate 's 来管理每个子对象的显示方式,这很好用。
<HierarchicalDataTemplate DataType="x:Type local:Document">
  <StackPanel Orientation="Horizontal">
  <Image Source="{Binding FileName, Converter="MyResourceConverter"}" />
  <TextBlock Foreground="Red" Text="{Binding Name}" />
  </StackPanel>
</HierarchicalDataTemplate>

我想为不同的对象显示特殊的图标。这就是它变厚的地方:我可以显示某些类或类型的静态图像,我什至可以显示基于实例化类的元数据的图标。我正在使用'IValueConverter ' 这样做,效果很好。
class MyResourseConverter : IValueConverter
{
  private static readonly IImageManager _imageManager = 
    new CachedImageManager(new SystemImageManager());


  public MyResourceConverter() // place where I'd like to inject this IImageManager
  {
  }
  //... IValueConverter Properties
  //... That uses the _imageManger
}

我的 ' IValueConverter ' 有依赖项,我不知道如何注入(inject)这些依赖项,我已经到处搜索以了解如何解决这个问题。我见过的最接近解决此问题的方法是使用类似'ServiceLocator ' inline 在类里面,但这对我来说似乎是一种反模式,它首先完全违背了 IoC 的目的。

还有其他方法可以让我的子图对象显示或'convert ' 他们的数据变成了 ' ImageSource ' 没有转换器?

最佳答案

您可以使用x:Arguments在 XAML 中通过转换器构造函数注入(inject)依赖项。

关于c# - 将对象属性转换为不同的可视对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27813724/

相关文章:

wpf - 在 MVVM 架构中应在何处以及如何管理选定的项目?

c# - 在 C# 中如何获取网格中单元格的内容?

wpf - 在 XP 或 Vista/7 上的 VB.NET & WPF 或 WinForms 中向标题栏添加按钮(如 Firefox 4)

.net - 如何使用数据绑定(bind)在 WPF 中创建无限深度的 TreeView?

mvvm - 使用 OnPropertyChange 在 MVVM 中打开保存文件对话框是否正常

wpf - 从 ViewModel 绑定(bind)图像

c# - 如何进行批量更新?

c# - 在参数中将 list<string> 转换为 IEnumerable<guid>

c# - 如何从工作流对话框中删除标题中的问号?

c# - ToggleButton 根据状态更改图像