Binding问题

-小仙- 2012-09-07 02:57:13
...全文
110 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
-小仙- 2012-09-10
  • 打赏
  • 举报
回复
你的方法我也想到了,只不过觉得麻烦!看来只能这样了。


我不认为我的数据结构怪异,相反非常合理,你应该静下心来好好研究一下我说的,
比如我要进行一系列的参数(物理等相关的)设置
参数有值和单位,单位有时间的、电压的、频率的等等,
那我自然就想到了一个泛型的类
比如 class Param<ValueType,UnitType> ; 这样不对吗?

而很多的类型会用到这个结构,比如类型TA,TB
那我在建立下面的结构
clas TA
{
Param<double,UnitTime> Period;
...

}
其中UnitTime:
enum UnitTime
{
ms,
s,
ks,
...
}
难道这样的结构是怪异的?只适合我自己的?
cheng2005 2012-09-10
  • 打赏
  • 举报
回复
           SomeTh some;
public SomeTh Some
{
get { return some; }
set
{
if (some != null)
{
some.PropertyChanged -= some_PropertyChanged;
}
some = value;
if (some != null)
{
some.PropertyChanged += some_PropertyChanged;
}
base.OnPropertyChanged("Some");

}
}

void some_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnPropertyChanged("Some");
}

至于那么纠结吗?
还是那句话,你所谓的“有用”都是建立在你自己那套需求基础上的“有用”
怪异的需求产生怪异的设计。你要的东西在上面,但是我依然不觉得这东西有具体意义。
-小仙- 2012-09-10
  • 打赏
  • 举报
回复

<DataTemplate x:Key="myParamTemplate">
<Border Name="border" BorderBrush="Aqua" BorderThickness="1"
Padding="5" Margin="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Param:"/>
<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=Age,UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Path=Name,UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Border>
</DataTemplate>

<ContentControl Content="{Binding Path=Stu,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
ContentTemplate="{StaticResource myParamTemplate}"
Background="Red"/>


最主要的是,如果myParamTemplate指定的内部UI元素发生改变的话,能引起ContentControl 的Content属性发生变化,就能实现我说的功能!

本例中,myParamTemplate中的TextBox 与具体的值 Age绑定,所以它至于Age属性进行数据交换,而不会引起,TextBox 的元素书的父级发生改变通知,而逻辑上,Content所binding的Stu已经发生变化了!
-小仙- 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:
顶下,问题简言之,就是:
是否把Model作为整体在ViewModel中以属性的显示暴露给View,而View层可以实现Model整体的读取!

我之前已经说了,你想的东西不现实。而且我想不出你有此种需求的真实意义。抛开MVVM来讨论这个问题吧,因为那只是沧海一粟。
首先,你要知道自己定义的数据结构是否合适。
然后,再确定这种需求是否有必要。


……
[/Quote]

兄弟! 我提出的问题是很有意义的,而且如果可以,那么在采用MVVM时,就viewmodel对model进行包裹这一环节可以变得轻松和简洁,绝非无意义。

因为ViewModel在包裹Model时,必须要将Model中需要数据改变通知的属性,在ViewModel中再次包裹一次,比如:


Model:
public class Student
{
int Age{get;set;}
string Name{get;set;}
}
=================
ViewModel:

public class StudentViewModel : ViewModelBase
{
Student _stu;

public int Age
{
get { return _stu.Age; }
set
{
_stu.Age= value;
base.OnPropertyChanged("Age");
}
}

public string Name
{
get { return _stu.Name; }
set
{
stu.Name= value;
base.OnPropertyChanged("Name");
}
}
}


而加入在Model层的Student类的属性里面有个是自定义类的类型呢,比如:

public class SomeTh
{
int A{get;set;}
double B{get;set;}
}

public class Student
{
int Age{get;set;}
string Name{get;set;}
SomeTh Some{get;set;}
}
那么
StudentViewModel 在实现包裹的时候,你就会发现,你必须也要实现SomeThViewModel,并在里面实现A 和B 的数据改变通知。而A和B的数据改变不会是的StudentViewModel 里面的SomeTh 得到通知,而假如A和B的数据校验是和外部的Age和Name属性有关,那么就比较麻烦了,

请不要怀疑我的数据结构!

至于你后面的回答 ,我觉得你是跑题了!

我之所以给出StudentGroup ,就是为了说明这个问题的, 我说了 这只是一个抽象,只是为了描述问题,不要探究例子中的数据结构本身的逻辑!

但还是非常感谢你的回答,你也花了很多时间,CSDN的C#的帖子,完全是海贴,每天的帖子的量也太大了吧,发个贴基本上就是沉!
cheng2005 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
顶下,问题简言之,就是:
是否把Model作为整体在ViewModel中以属性的显示暴露给View,而View层可以实现Model整体的读取!
[/Quote]
我之前已经说了,你想的东西不现实。而且我想不出你有此种需求的真实意义。抛开MVVM来讨论这个问题吧,因为那只是沧海一粟。
首先,你要知道自己定义的数据结构是否合适。
然后,再确定这种需求是否有必要。


public class Student : ViewModelBase
{
int _age;
public int Age
{
get { return _age; }
set
{
_age = value;
base.OnPropertyChanged("Age");
}
}
}

就看这段代码吧,Age属性是一个int类型的变量,那么我问你,Age这个属性知道自己属于Student吗?不知道,当然我们可以通过加特性的方式让它认识自己的父亲,比如

[OwnerType(Student)]
public int Age

这样起码有一种渠道可以告之Age这个属性他的所有者到底是什么类型,但是,这有意义吗?请仔细思考...
其实Age还是不认识自己的所有者,准确的来说Age依然不知道Student的存在,知道他俩关系的其实是第三者(当然Student肯定是知道的),本质依然没有改变。

再谈下一个问题,Age如果知道自己进行了变化。答案很明显,Age没有这个能力。这就好像我在一份名单上勾掉两个人的名字再写上几个名字,你说,如果我不告诉相关的人,这个名字对应的人会发现在名单上刚刚发生变化的事情吗?

不过这里好像有一条路可以走
先定义一个接口
public interface IOwnerType
{
void MeChanged();
}

假设int类型里面有这样一个东西
List<IOwnerType> OwnerTypes;
让Student实现IOwnerType,这样在为Age属性赋值的时候,Student可以把自己这个对象传递到int 型的Age对象内。在Age发生变化的时候,它可以调用自己的OwnerTypes进行通知。

最后一个问题,这真的是你想要的吗?
-小仙- 2012-09-10
  • 打赏
  • 举报
回复
顶下,问题简言之,就是:
是否把Model作为整体在ViewModel中以属性的显示暴露给View,而View层可以实现Model整体的读取!
cheng2005 2012-09-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

你的方法我也想到了,只不过觉得麻烦!看来只能这样了。


我不认为我的数据结构怪异,相反非常合理,你应该静下心来好好研究一下我说的,
比如我要进行一系列的参数(物理等相关的)设置
参数有值和单位,单位有时间的、电压的、频率的等等,
那我自然就想到了一个泛型的类
比如 class Param<ValueType,UnitType> ; 这样不对吗?

而很多的类型会用到这个结……
[/Quote]
一颗大树包含,树根,树干,树枝,树叶,一滴水想要从树根移动到树叶,需要经历树根,树干,树枝,树叶这几个阶段,缺一不可。当然,在四维空间上可以跨越这个局限,但现在请我们在现有的科学,也就是三维空间上讨论问题,所以得出的结论,想在内部从树根到树叶,不经历中间过程的传递是可能的,注意,我说的是“内部”,在外部当然是可能,水气蒸发,结云,下雨,降落到树叶,这样就需要一条外部通道,不管怎么说,通道必须存在才可能实现这个过程。
-小仙- 2012-09-07
  • 打赏
  • 举报
回复
悲剧,怎么没人
jackson所需要的所有jar jackson-all-1.6.2.jar jackson-core-asl-1.6.2.jar jackson-mapper-asl-1.6.2.jar jakarta-oro.jar 1. 背景 目前维护的产品使用jackson处理json,现整理一下jackson相关资料,希望对初次接触jackson的新手有所帮助。 jackson主页: http://jackson.codehaus.org/ jackson document: http://wiki.fasterxml.com/JacksonJavaDocs JacksonInFiveMinutes: http://wiki.fasterxml.com/JacksonInFiveMinutes 本文主要内容译自JacksonInFiveMinutes,增加了部分示例,转载请注明出处。 受java平台上各种处理xml的类库(StAX, JAXB等)启发,Jackson提供一种处理json的java类库。Jackson的目标是为开发者提供快速、准确、轻量级和用起来最爽的json处理类库。本文将概括介绍Jackson的主要功能和相关功能的使用示例。 2. 使用方式 Jackson提供三种可选的json处理方式: 1) Streaming API 又称Incremental parsing/generation, 受StAX API启发,以非关联递增方式读写json内容。 通过 org.codehaus.jackson.JsonParser读取,通过org.codehaus.jackson.JsonGenerator写入。 2) Tree Model 通过基于内存的树形结构来描述json数据,和 XML DOM类似。通过org.codehaus.jackson.map.ObjectMapper构建树,树由JsonNode节点组成。 3) Data Binding 基于属性访问或注解的方式将json和POJO对象互相转换, 受JAXB基于注解的处理方式启发。通过org.codehaus.jackson.map.ObjectMapper读写json数据。它包含两种类型: 3.1 Simple Data Binding 用于json和Java Maps, Lists, Strings, Numbers, Booleans and nulls的相互转换。 3.2 Full Data Binding 用于json和Java Bean的相互转换。 下面从使用的角度上比较三种处理方式: Streaming API 执行效率最高,读写速度最快,另外两种方式都基于它实现; Tree Model 是最灵活的; Data Binding 通常是最方便使用的;

110,552

社区成员

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

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

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