|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
这是怎么回事
如何正确绑定

谢谢
...全文
354 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"); 
 }        
}
这时取到的就有可能不是你刚才赋的那个值。这个我也是最近刚在项目中发现的。
内容概要:本文围绕【语音增强】领域的组稀疏信号去噪问题展开研究,提出了一种结合非凸正则化与凸优化理论的去噪方法,旨在提升含噪语音信号的可懂度与质量。文章系统阐述了组稀疏信号模型的构建机制,引入非凸正则项以更精确地逼近理想稀疏性,克服传统凸正则化在稀疏表达上的局限性,并采用高效的凸优化算法保障模型求解的稳定性与收敛性。整个算法流程在Matlab平台上完整实现,涵盖语音信号预处理、稀疏系数求解、去噪重构等关键环节,并配套提供可复现的代码资源,便于研究人员进一步验证与拓展。该方法在保留数学可处理性的同时显著增强了去噪性能,尤其适用于低信噪比环境下的语音恢复任务。; 适合人群:具备一定信号与系统、数字信号处理理论基础,熟悉稀疏表示与最优化方法,且拥有Matlab编程能力的研究生、科研人员及从事语音增强、音频工程、通信系统等相关领域的工程技术人员。; 使用场景及目标:①应用于语音通信、智能助听设备、语音识别前端等对语音质量要求较高的实际系统;②作为高校课程或科研项目的教学案例,帮助深入理解稀疏表示、非凸优化与凸优化算法的融合机制;③为后续研究非凸正则化在图像去噪、生物医学信号处理等其他稀疏恢复问题的性能优势提供理论依据与实现范例。; 阅读建议:建议读者结合所提供的Matlab代码逐模块分析,重点理解非凸正则项的设计动机及其对稀疏性的增强作用,深入掌握优化求解过程迭代算法的实现细节;同时可通过调整正则化参数、测试不同噪声类型(如白噪声、车间噪声)与强度的语音信号,系统评估算法的鲁棒性、收敛速度与去噪效果,从而全面把握该方法的优势与潜在局限。
内容概要:本文系统介绍了节点不连续伽辽金方法(NDG)在求解线性和非线性平流方程的一维数实现过程,并配套提供了完整的Matlab代码实现。该方法作为一种高精度、高分辨率的数离散化技术,特别适用于对流主导的偏微分方程求解,在处理间断解和保持数稳定性方面具有突出优势。文章详细阐述了NDG方法的核心理论基础,包括弱形式构造、局部基函数选取、数通量处理、时间推进格式(如显式Runge-Kutta方法)以及边界条件的实施策略。通过多个典型算例(如线性对流、Burgers方程等)的仿真分析,充分验证了该方法在捕捉激波、避免非物理振荡及保持高阶精度方面的有效性。结合代码实践,读者可深入掌握NDG方法的算法设计与编程实现的关键环节。; 适合人群:具备偏微分方程数解法、有限元方法或计算流体力学基础知识,熟悉Matlab编程语言,从事科学计算、工程仿真、应用数学或相关领域研究的研究生、科研人员及工程师。; 使用场景及目标:①用于高阶数方法的教学演示与学习,加深对间断伽辽金方法的理解;②应用于流体力学、气象模拟、环境科学等领域对强对流现象的精确数模拟;③作为复杂物理系统仿真对流项高精度离散化的核心技术支撑;④为科研工作者开发定制化求解器提供可复用的算法原型与代码参考。; 阅读建议:建议读者结合Matlab代码逐行调试与运行,对照理论推导理解每个模块的功能实现,重点关注数通量、质量矩阵和刚度矩阵的构造过程。同时推荐参阅相关经典文献以深化对NDG方法数学理论和收敛性分析的理解,从而更好地将该方法迁移应用于自身研究课题

111,129

社区成员

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

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

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