Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖项属性画布未绑定_C#_Wpf_Canvas_Controls_Viewmodel - Fatal编程技术网

C# 依赖项属性画布未绑定

C# 依赖项属性画布未绑定,c#,wpf,canvas,controls,viewmodel,C#,Wpf,Canvas,Controls,Viewmodel,我正在制作一个可以编辑图像的工具,所以我有一个自定义控件可以在画布上绘制。对于这个控件,我绑定了画笔的分辨率和颜色,效果非常好,但是当我尝试绑定画布时,我在myViewModel中总是得到null 我试着绑定一个列表,但也没用。我已经试着找出问题出在哪里了大约12个小时了,所以我想是时候请你们帮忙了,这样我也许可以找出问题出在哪里 我曾经在viewmodels中使用单例,然后我可以很好地链接到画布,但后来我意识到这是一种糟糕的工作方式,所以我尝试将其与依赖属性绑定 每当我尝试访问画布时,它的值为

我正在制作一个可以编辑图像的工具,所以我有一个自定义控件可以在画布上绘制。对于这个控件,我绑定了画笔的分辨率和颜色,效果非常好,但是当我尝试绑定画布时,我在myViewModel中总是得到null

我试着绑定一个列表,但也没用。我已经试着找出问题出在哪里了大约12个小时了,所以我想是时候请你们帮忙了,这样我也许可以找出问题出在哪里

我曾经在viewmodels中使用单例,然后我可以很好地链接到画布,但后来我意识到这是一种糟糕的工作方式,所以我尝试将其与依赖属性绑定

每当我尝试访问画布时,它的值为null,即使我初始化了它

控制

    public static readonly DependencyProperty CanvasProperty = DependencyProperty.Register(
  "CanvasToDraw", typeof(Canvas), typeof(DrawCanvas), new PropertyMetadata(default(Canvas), null, null));

    public Canvas CanvasToDraw
    {
        get { return (Canvas)GetValue(CanvasProperty); }
        set { SetValue(CanvasProperty, value); }
    }

        public DrawCanvas()
    {
        InitializeComponent();
        CanvasToDraw = CanvasGrid;
    }
XAML

<Controls:DrawCanvas x:Name="DrawCanvas1" Resolution="{Binding Resolution}" CanvasToDraw="{Binding DrawingCanvas}" RectangleList="{Binding RectangleList, ElementName=DrawCanvas1}" ColorToDraw="{Binding SelectedColor}" HorizontalAlignment="Left" Height="256" Margin="10,40,0,0" VerticalAlignment="Top" Width="256" />
        private Canvas _drawingCanvas;
    public Canvas DrawingCanvas
    {
        get { return _drawingCanvas; }
        set
        {
            _drawingCanvas = value;
            OnPropertyChanged("DrawingCanvas");
        }
    }

如果需要,我可以提供更多的代码,但这是大部分相关代码。是的,我确实使用INotifyPropertyChanged,因为我绑定了其他可以工作的东西。

我一直在寻找解决方案,但答案很简单。我假设绑定是双向的,但显然我必须设置Mode=TwoWay,一切都像一个符咒。(链接ObservableCollection,而不是画布)

请注意,视图模型中不应包含UI元素(如DrawingCanvas)。除此之外,“即使我初始化了它”,你是指分配
CanvasToDraw=CanvasGrid在DrawCanvas构造函数中?是的,这是正确的方法吗?您认为从画布获取数据的最佳方式是什么?画布存在于矩形之外,在本例中,矩形是像素,当我按下按钮“清洁”画布时,我需要访问它们以使它们变为白色。我尝试绑定矩形列表,但由于某种原因(可能我需要在特定位置或其他地方对其进行初始化)+CanvasGrid是画布的名称,我使用BlockViewModel.Instance.Canvas=CanvasGrid将其链接起来。但是我停止使用实例。您应该使用一个带有画布的ItemsControl作为ItemsPanel,如图所示。您的初始化将无法工作,因为该值已被绑定替换。它返回
null
,因为视图模型中的源属性是
null
。绑定也必须是双向的。好的,我将查找一些关于ItemsControl的内容,并尝试找出如何在我的应用程序中使用它,谢谢您的帮助。