C# 如何绑定到不可绑定的属性而不违反MVVM?

C# 如何绑定到不可绑定的属性而不违反MVVM?,c#,wpf,svg,mvvm,data-binding,C#,Wpf,Svg,Mvvm,Data Binding,我使用以下方式显示静态资源图像: <svgc:SvgViewbox Source="/Resources/label.svg"/> 这很好用。但是,我希望通过绑定到视图模型来控制显示什么图像 我遇到的问题是SvgViewbox的Source属性不可绑定 如何在不违反MVVM的情况下绕过此限制(例如,将控件传递到视图模型并在其中进行修改)?您要查找的是所谓的附加属性。MSDN提供了一个标题为“”的主题 在您的情况下,它可能看起来像这样简单 namespace MyProject.

我使用以下方式显示静态资源图像:

<svgc:SvgViewbox Source="/Resources/label.svg"/>

这很好用。但是,我希望通过绑定到视图模型来控制显示什么图像

我遇到的问题是SvgViewbox的
Source
属性不可绑定


如何在不违反MVVM的情况下绕过此限制(例如,将控件传递到视图模型并在其中进行修改)?

您要查找的是所谓的附加属性。MSDN提供了一个标题为“”的主题

在您的情况下,它可能看起来像这样简单

namespace MyProject.Extensions 
{
    public class SvgViewboxAttachedProperties : DependencyObject
    {
        public static string GetSource(DependencyObject obj)
        {
            return (string) obj.GetValue(SourceProperty);
        }

        public static void SetSource(DependencyObject obj, string value)
        {
            obj.SetValue(SourceProperty, value);
        }

        private static void OnSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
            var svgControl = obj as SvgViewbox;
            if (svgControl != null)
            {
                var path = (string)e.NewValue;
                svgControl.Source = string.IsNullOrWhiteSpace(path) ? default(Uri) : new Uri(path);
            }                
        }

        public static readonly DependencyProperty SourceProperty =
            DependencyProperty.RegisterAttached("Source",
                typeof (string), typeof (SvgViewboxAttachedProperties),
                                    // default value: null
                new PropertyMetadata(null, OnSourceChanged));
    }
}
XAML来使用它

<SvgViewbox Margin="0 200" 
    local:SvgViewboxAttachedProperties.Source="{Binding Path=ImagePath}" />

请注意,
local
是名称空间前缀,它应该指向该类所在的程序集/名称空间,即
xmlns:local=“clr namespace:MyProject.Extensions;assembly=MyProject”

然后只使用附加的属性(
local:Source
),而不要使用
Source
属性


新附加属性
local:Source
的类型为System.Uri。要更新图像,请先指定null,然后再指定文件名/文件路径。

这对我来说很有效,只是做了一点小小的调整。由于
svgControl.Source
是一个
Uri
,请使用
svgControl.Source=newuri((字符串)e.NewValue)设置它@burntoast11:谢谢,我修好了。最初,我只是基于问题编写代码,不考虑所讨论控件的具体API。