如何将绑定传递给用户控件

时间:2018-12-13 05:30:28

标签: c# wpf mvvm data-binding

有人可以帮助我解决我的问题吗?

我想使用依赖项属性将值传递给包含User控件的类。

我创建了一个在图像中绘制“平移和缩放”的程序。

“我的平移和缩放”基于Pan & Zoom Image

在办公室工作将近三年。我创建了4个与此程序相似的程序。

所以我希望它可重用,而不是再次复制代码。

我创建了一个包含Pan和zoom的c#类库

平移和缩放的类名称为ZoomBorder,我添加了一个依赖项属性,该属性用于检查是否要执行“平移”或“绘图”操作

public bool IsDrawing
        {
            get { return (bool)GetValue(IsDrawingProperty); }
            set { SetValue(IsDrawingProperty, value); }
        }

        // Using a DependencyProperty as the backing store for IsDrawing.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsDrawingProperty =
            DependencyProperty.Register("IsDrawing", typeof(bool), typeof(ZoomBorder), 
                new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null));

然后在该类库中,我添加了Wpf用户控件并将其命名为Viewer

我还在上述用户控件中添加了图片控件

这是类库中的xaml代码

DataContext="{Binding RelativeSource={RelativeSource Self}}"



<e:ZoomBorder x:Name="viewer" IsDrawing="{Binding IsDrawing}" >
            <Grid>
                <Image Source="{Binding ImageSource}" />
</Grid>
        </e:ZoomBorder>

下面是Viewer的代码

public partial class Viewer : UserControl
    {
        public Viewer()
        {
            InitializeComponent();
        }


        /// <summary>
        /// This is for setting the image in the Viewer
        /// </summary>
        public string ImageSource
        {
            get { return (string)GetValue(ImageSourceProperty); }
            set { SetValue(ImageSourceProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ImageSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ImageSourceProperty =
            DependencyProperty.Register("ImageSource", typeof(string), typeof(Viewer), new PropertyMetadata(null));


        public bool IsDrawing
        {
            get { return (bool)GetValue(IsDrawingProperty); }
            set { SetValue(IsDrawingProperty, value); }
        }

        // Using a DependencyProperty as the backing store for IsDrawing.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty IsDrawingProperty =
            DependencyProperty.Register("IsDrawing", typeof(bool), typeof(Viewer),
                new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, null));
    }

这是我实现此类的方式。但是它没有显示图片

<DrawPanZoomResizeMove:Viewer IsDrawing="{Binding IsDrawing}" ImageSource="{Binding ImagePath}" />

但是当我这样做时,它就起作用了

<DrawPanZoomResizeMove:Viewer IsDrawing="{Binding IsDrawing}" ImageSource="Image.jpg" />

显示图像。

然后为了检查绑定是否起作用。我添加了一个Image控件(不在库中,而是在主项目中)。然后从绑定中加载图像。而且有效。

这是我使用绑定时的错误消息

  

System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“查看器”(名称=“)”上找不到“ ImagePath”属性。 BindingExpression:Path = ImagePath; DataItem ='查看器'(名称='');目标元素是“查看器”(Name ='');目标属性为“ ImageSource”(类型为“字符串”)

有人可以指出我的代码中的错误。我已经尝试解决了几个小时。但我仍然无法解决问题

更新:

我将绑定更改为

<DrawPanZoomResizeMove:Viewer IsDrawing="{Binding IsDrawing}" ImageSource="{Binding ImageSource}" />

但是问题仍然存在。当我使用Binding时图像不会加载

更新:

我在MainWindow.xaml中添加了它

<Window.Resources>
        <vm:ViewModel x:Key="vm"/>
    </Window.Resources>

然后我将代码更改为

<DrawPanZoomResizeMove:Viewer IsDrawing="{Binding IsDrawing}" ImageSource="{Binding ImageSource, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Source={StaticResource vm}}" />

在设计模式下加载的图像。

但是当我运行程序时。错误变为空白

给我错误

System.Windows.Data Error: 40 : BindingExpression path error: 'ImageSource' property not found on 'object' ''ViewModel' (HashCode=26148945)'. BindingExpression:Path=ImageSource; DataItem='ViewModel' (HashCode=26148945); target element is 'Viewer' (Name=''); target property is 'ImageSource' (type 'String')

如果我正确理解错误。在视图模型中找不到图像源。这是正确的,因为我的ViewModel中的CLASS library没有ImageSource属性,因为Dependency属性位于Viewer.xaml中。那么解决这个问题的正确方法是什么?

0 个答案:

没有答案