|ZYCWPF| 在MVVM中,如何绑定InkCanvas的Strokes,绑定后我在后台取到的值都为null 谢谢

javamy023 2012-11-08 10:17:46

<InkCanvas x:Name="inkCanv" Margin="10" Background="White" Strokes="{Binding Strokes,Mode=TwoWay}" z:StrokeCollected.Command="{Binding OnSaveInkStroke}" z:StrokeErased.Command="{Binding OnSaveInkStroke}" z:StrokeErasing.Command="{Binding OnSaveInkStroke}">
</InkCanvas>

我看了这个白板的输出是Strokes,然后我在后台定义Strokes属性进行绑定

/// <summary>
/// 白板内容
/// </summary>
public StrokeCollection Strokes
{
get { return strokes; }
set
{
strokes = value;
this.RaisePropertyChanged("Strokes");
}
}

最后在画画板的时候取得这个值

public ICommand OnSaveInkStroke { get; set; }

public void SaveInkStroke(EventArgs e)
{
try
{
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();

this.Strokes.Save(memoryStream);

memoryStream.Flush();

Service.ServiceClient.Instance.SendInkStrokes(memoryStream.GetBuffer());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Title);
}
}

但是我这里的Strokes得到的值都为null
这是怎么回事
如何正确绑定

谢谢
...全文
242 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
javamy023 2012-11-09
  • 打赏
  • 举报
回复
奇怪了我的画板的命令没有触发

        <Border Name="brInkCanvas" Grid.Column="1" Grid.Row="1" Visibility="{Binding IsLogin,Converter={StaticResource VisibilityConverter}}">
            <InkCanvas x:Name="inkCanv" Margin="10" Background="White" Strokes="{Binding Strokes}" z:StrokeCollected.Command="{Binding OnSaveInkStroke}" z:StrokeErased.Command="{Binding OnSaveInkStroke}" z:StrokeErasing.Command="{Binding OnSaveInkStroke}">
            </InkCanvas>
        </Border>

        /// <summary>
        /// 绑定事件
        /// </summary>
        void BindEvent()
        {
            this.OnSendInkStroke = new DelegateCommand<System.Windows.Controls.InkCanvasStrokeErasingEventArgs>(SendInkStroke);
        }
         /// <summary>
        /// 发送白板内容更新
        /// </summary>
        public ICommand OnSendInkStroke { get; set; }
        public void SendInkStroke(System.Windows.Controls.InkCanvasStrokeErasingEventArgs e)
        {
            try
            {
                System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();

                this.Strokes.Save(memoryStream);

                memoryStream.Flush();

                Service.ServiceClient.Instance.SendInkStrokes(memoryStream.GetBuffer());
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message, Title);
            }
        }
哪里出问题了 谢谢
jshi123 2012-11-09
  • 打赏
  • 举报
回复
Strokes是一个集合类型,在InkCanvas画图时,并不会去调用后台绑定属性Strokes的set方法,而是会向已绑定的StrokeCollection中添加笔画。 所以你的Strokes属性的get方法要返回一个StrokeCollection的实例,你现在返回的是null,就是什么也没绑定。 StrokeCollection本身实现了INotifyPropertyChanged, INotifyCollectionChanged接口,也就是集合内容有更新时,它会自动去通知其它绑定目标。 所以ViewModel的Stroke属性可以写成这样:

	private StrokeCollection strokes;

	/// <summary>
	/// 白板内容
	/// </summary>
	public StrokeCollection Strokes
	{
		get
		{
			if (strokes == null)
			{
				strokes = new StrokeCollection();
			}
			return strokes;
		}
	}
因为没有set,前台要去掉TwoWay(注意这是集合属性,双向绑定的机制是在集合内部,而不是集合本身)

    <InkCanvas x:Name="inkCanv" Margin="10" Background="White"
                Strokes="{Binding Strokes}"
                z:StrokeCollected.Command="{Binding OnSaveInkStroke}" 
                z:StrokeErased.Command="{Binding OnSaveInkStroke}" 
                z:StrokeErasing.Command="{Binding OnSaveInkStroke}">
    </InkCanvas>
jshi123 2012-11-09
  • 打赏
  • 举报
回复
活活
javamy023 2012-11-09
  • 打赏
  • 举报
回复
引用 4 楼 jshi123 的回复:
嗯?还没睡啊 我看看
生活压力大。最近一直忙学习WPF,让明年涨点工资 谢谢
javamy026 2012-11-09
  • 打赏
  • 举报
回复
不好意思。。。 自己搞错了 后面方法给我改了名字了 谢谢
jshi123 2012-11-09
  • 打赏
  • 举报
回复
嗯?还没睡啊 我看看
杨友山 2012-11-08
  • 打赏
  • 举报
回复
如果绑定了,界面也能输出值,说明绑定是没问题的。那么你在这个方法中取值,就要考虑,绑定是需要时间的,不是说赋值后立即就能取得绑定的值。 比如,你在后台对你的 inkCanv里的 Strokes赋值后,你立马去取

   public StrokeCollection Strokes       
 {            
get { return strokes; }            
set 
 { strokes = value; 
this.RaisePropertyChanged("Strokes"); 
 }        
}
这时取到的就有可能不是你刚才赋的那个值。这个我也是最近刚在项目中发现的。
课程介绍本套课程,大喵将带着大家手把手,编辑每一行代码,使用原生Javascipt及ES6的一些新特性,仿照目前国内非常流行的Vue框架的源码,开发构建一个属于你们自己的MVVM框架。让大家能够很清晰的学习及掌握,模板编译,数据绑定,响应式,文档碎片,观察者模式,发布订阅模式等等,这些Vue的核心知识点,都是怎么回事,它们之间有哪些关联,是如何进行双向数据绑定的等等。在使用vue2.x的核心Object.defineProperty构建完成框架后,大喵也会使用Vue3.0引入的数据劫持的Proxy新特性,来改造我们的MVVM框架,提升我们的框架性能。最终,大喵会手把手带着大家,从0开始配置webpack.config.js配置文件以及引入babel-loader,配置.babelrc文件,转换我们JS文件的的ES6语法,最终压缩输出我们的MVVM框架库文件。课程目录01 手把手搭建MVVM框架 课程介绍、02 文件结构及基础类创建、03 入口类DamiaoMvvm的实现、04 模板编译、05 元素节点解析编译、06 v-model 数据绑定逻辑梳理、07 v-model 数据绑定实现、08 模板文本编译逻辑梳理、09 模板文本渲染绑定、10 观察者Wather逻辑梳理、11 Wather 逻辑实现、12 Object.defineProperty()、13 defineProperty 小案例、14 observer数据劫持梳理、15 defineProperty数据劫持实现、16 发布订阅类实现、17 Proxy 介绍与概述、18 使用Proxy改造MVVM框架、19 使用Proxy实现响应式、20 webpack 打包配置、21 babel 配置及文件输出、22 Mvvm Proxy 框架打包、23 Mvvm 框架搭建课程总结MVVM框架介绍MVVM是 Model-View-ViewModel 的缩写。mvvm是一种设计思想。Model 层代表数据模型,也可以在Model定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。在MVVM架构模式下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model,而Model 数据的变化也会立即反应到View 上。ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧