如何在 MVVM 视图模型中指定资源?

2024-04-25

假设我想显示对象列表,其中每个对象应该有一个名称和一个合适的图像(例如带有图标的菜单项,或带有文本和图像的按钮)。

所有示例和程序都将视图模型中的图像公开为 PNG 文件的路径,然后绑定Source of an Image对此。但是如果我想使用矢量图像(例如作为DrawingImage在当地ResourceDictionary)?从视图模型中公开 DrawingImage 似乎很糟糕,因为我必须存储对应用程序/窗口/用户控件/...的引用(建议不要从视图模型中公开此类 XAML 对象)。

因此,更好的方法是在视图模型中使用字符串标识符,然后以某种方式选择适当的资源。如果该标识符是资源键,则此代码片段看起来很诱人,但不起作用:

<Image Source="{StaticResource {Binding Icon}}"/>

我找到了两种解决方法,尽管它们对我不起作用。

  1. 第一个是使用与图标的普通绑定,并使用转换器在中查找资源Application.Current。如果资源存储在其他地方,我认为这不起作用(并且我最初遇到此问题的情况还没有运行应用程序,因为它是一个选择要启动的应用程序的窗口!)。

  2. 第二个解决方法 http://sweux.com/blogs/psampaio/index.php/2009/06/16/using-data-binding-with-static-resources-in-wpf/正在使用源自的标记扩展StaticResourceExtension获取它的ResourceKey来自传递的绑定:

    <Image Source="{local:BindableStaticResource {Binding Icon}"/>
    

    这个看起来非常整洁,因为它可以使用本地资源,也可以用于其他事情。但在使用它时,我总是遇到异常(“找不到名为 {FooIcon} 的资源。”,显示正确的 XAML 文件和扩展名的位置)。即使是源自的空资源扩展StaticResourceExtension刚刚将资源密钥传递给基本构造函数的方法不起作用,我无法解释原因。只是使用StaticResourceExtension工作得很好。

我有什么想法可以解决第二种方法,甚至更好的解决方案?

Edit

我注意到它does直接使用时可以这样工作:

<Window>
    <Window.Resources>
        <DrawingImage x:Key="SomeIcon"/>
    </Window.Resources>
    <Image Source="{BindableStaticResource {Binding Icon}}"/>
</Window>

但例如在DataTemplate。虽然是正常人StaticResourceExtension在这两种情况下都有效,所以我很困惑出了什么问题。


您提到的第一个解决方法可以在这里找到:将数据上下文字符串属性绑定到 StaticResource 键 https://stackoverflow.com/questions/695624/binding-a-datacontext-string-property-to-a-staticresource-key

我尝试使用你提到的第二个工作(http://sweux.com/blogs/psampaio/index.php/2009/06/16/using-data-binding-with-static-resources-in-wpf/ http://sweux.com/blogs/psampaio/index.php/2009/06/16/using-data-binding-with-static-resources-in-wpf/),但我从来没有让它工作过。由于 DataContext 为 null,因此它抛出了 ArgumentNullException。我认为这与我使用 DataTemplate 从 ViewModel 创建视图有关,并且在调用 ProvideValue 方法之前未设置 DataContext(在该页面的示例中,DataContext 设置为.xaml.vb 类)。

因此,我开始寻找一种解决方法,并找到了一种还涉及转换器的解决方法,但该方法通过 FrameworkElement 方法查找资源,而不是四处寻找 Application.Current。我找到的详细信息如下:

http://drwpf.com/blog/2007/08/18/can-my-value-converter-access-the-target-of-the-binding/ http://drwpf.com/blog/2007/08/18/can-my-value-converter-access-the-target-of-the-binding/

我把相关信息复制到这里:

它涉及实现接口 IMultiValueConverter 的 ValueConverter,以访问设置绑定的控件。

Convert方法的代码如下:

public object Convert(object[] values, Type targetType, 
    object parameter, CultureInfo culture)
{
    FrameworkElement targetObject = values[0] as FrameworkElement;

    if (targetObject == null)
    {
        return DependencyProperty.UnsetValue;
    }
    return targetObject.TryFindResource(values[1]);
}

内容控件的 XAML 如下所示:

<ContentControl>
  <ContentControl.Content>
    <MultiBinding Converter="{StaticResource Converter}">
      <MultiBinding.Bindings>
        <Binding RelativeSource="{RelativeSource Self}" />
        <Binding Path="ResourceKey" />
      </MultiBinding.Bindings>
    </MultiBinding>
  </ContentControl.Content>
</ContentControl>

图像的 XAML 如下:

<Image Height="16" Width="16">
    <Image.Source>
        <MultiBinding Converter="{StaticResource Converter}">
            <MultiBinding.Bindings>
                <Binding RelativeSource="{RelativeSource Self}" />
                <Binding Path="ResourceKey" />
            </MultiBinding.Bindings>
        </MultiBinding>
    </Image.Source>
</Image>

工作起来就像一个魅力:D

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MVVM 视图模型中指定资源? 的相关文章

  • 为什么人们在 ICommand 上使用 CommandManager.InvalidateRequerySuggested()?

    我正在制作自己的一些自定义 ICommand 实现 我看到很多实现都是这样的 public event EventHandler CanExecuteChanged add CommandManager RequerySuggested v
  • 如何在不违反 MVVM 的情况下绑定到不可绑定的属性?

    我在用SharpVector 的 SvgViewBox https sharpvectors codeplex com 显示静态资源图像 如下所示
  • 用Python识别图像

    我对 OCR 识别和 Python 都有点陌生 我想要实现的是从 Python 脚本运行 Tesseract 以 识别 tif 中的某些特定数字 我以为我可以为 Tesseract 做一些培训 但我在 Google 和 SO 上没有找到任何
  • 如何在Dialog中使用数据绑定?

    我在对话框中实现数据绑定时遇到问题 是否可以 下面是我的 xml
  • 图像上的 JQuery 加载事件

    我想在加载图像时将图像父级的大小调整为与图像相同的大小 此时我正在使用这段代码 window load function image principale each function this parent css height this
  • 您应该在 Windows 8 应用程序的哪个位置编写“隐私策略”代码?

    我的应用程序未通过认证 原因是 4 1 1 如果您的应用程序具有网络功能 则必须有隐私声明 您必须在应用程序的说明页面以及 Windows 设置超级按钮中显示的应用程序设置中提供对隐私政策的访问权限 他们在说什么 什么描述 如何设置 Win
  • 单击按钮本地化应用程序

    我在我的项目 mainMaster 页面中找到了 imageButtons
  • PHP - 从图像创建一张图像

    我有 n 张图像 想用 php 代码创建一张 我使用 imagecopymerge 但无法成功 请举一些例子 Code numberOfImages 3 x 940 y 420 background imagecreatetruecolor
  • 如何将 TargetNullValue 设置为日期?

    我使用 WPF 工具包的日历控件来允许用户选择日期 如果尚未选择日期 则 SelectedDate 绑定到的属性为 Null 这使得日历默认为公元 0 年 1 月 1 日 我想做类似的事情 SelectedDate Binding User
  • 我应该如何使用 jcrop 在客户端裁剪图像并上传?

    我正在开发一个包含文件上传 HTML 控件的组件 在使用文件上传元素选择图像后 该图像将呈现在 HTML5 Canvas 元素上 这是带有示例代码的 JSFiddle https jsfiddle net govi20 spmc7ymp h
  • Tabcontrol 中的 SelectedIndex 不变 - 调度程序问题

    为什么在我设置 SelectedIndex 0 后 我随后 而不是响应 得到使用 SelectedIndex 4 调用的事件处理程序 我追踪到对调度程序的调用 但我不明白为什么 计划如下 我有一个页面 其中包含带有各种选项卡的选项卡控件 当
  • Prism自定义确认交互

    我使用 Prism Unity WPF 和 Mvvm 在应用程序中创建了一个自定义确认窗口 我需要有关需要发送回视图模型的通知的帮助 我在详细记录视图中有这个 我们称之为 MyDetailView
  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • 使用 .NET 在 Windows 中创建弹出式“烤面包机”通知

    我正在使用 NET 并创建一个桌面应用程序 服务 当触发某些事件时 它将在桌面的一角显示通知 我不想使用常规的消息框 b c 那样会造成太大的干扰 我希望通知滑入视图 然后在几秒钟后淡出 我正在考虑一种类似于 Outlook 收到新邮件时发
  • 具有可绑定属性的自定义视图未在 Xamarin.Forms SAP 上正确绑定

    我有一个复选框 应该触发按钮的 IsEnabled 事件 但不知何故 应该执行的命令永远不会正确绑定并因此执行 这是 CheckBox xaml cs 控件 中的可绑定属性 public static readonly BindablePr
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • Android 如何从我的应用程序使用 SD 卡中的文件路径预览图像

    文件存在于sdcard image jpg我想创建我自己的应用程序 活动 按下按钮时 需要使用内置图像查看器显示存储在 SD 卡中的图像 按图像查看器中的后退按钮后 它应该返回到我正在运行的应用程序 需要一些帮助 您可以为此创建一个具有适当
  • Windows 8 和 LOB 应用程序

    为 Windows 8 构建业务线应用程序的推荐方法是什么 例如复杂的定制财务应用程序 它们显然不适合 Metro 风格 因此可能会成为常规桌面应用程序 那么建议使用WPF吗 有 vNext 吗 我作为开发人员构建的应用程序类型是桌面风格的
  • 使用(linq to sql)更新错误

    我有两个表 通过外键 CarrierID 绑定 Carrier CarrierID CarrierName CarrierID 1 CarrierName DHL CarrierID 2 CarrierName Fedex Vendor V

随机推荐