有人可以帮助我解决我的问题吗?
我想使用依赖项属性将值传递给包含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中。那么解决这个问题的正确方法是什么?