UI野路子 --- 【三】Item 的选择

qiqiminmin UID.638527
2015-12-19 发表

本帖最后由 qiqiminmin 于 2015-12-19 23:38 编辑

因为是个人经验,我发现自己的很多做法其实和“官方“的不太一样,因为不太顺手,经常自己弄。

在微软的各种ItemsControl,例如ListBox, GridView, ItemsControl的 DataTemplate里,有一个很大的缺陷。我如何知道当前Item是第几个呢?

在WPF中是可以实现的, ItemsControl.AlternationIndex,这就是当前item在items中的index.
[mw_shl_code=html,true]<DataTemplate>
<TextBlock Text="{Binding Path=(ItemsControl.AlternationIndex),
RelativeSource={RelativeSource TemplatedParent},
StringFormat={}Index is {0}}">
</TextBlock>
</DataTemplate>[/mw_shl_code]

但是,在Windows Runtime(UWP)中,微软忘记了(我暂且说忘记了!!!!!)
微软可以忘记,但是你老板没忘记怎么办?
***附件停止解析***

如果没有,切记要做到几点
【一】能在数据源中加 index,如果不允许访问全局的ViewModel,最好通过数据本身。
比如这是itemsControl的class
[mw_shl_code=csharp,true]class data
{
public int index {get;set;}
}[/mw_shl_code]

可以手动在加入ObservaCollection是初始index,也可以自己弄个自动自加的index,总是要多次检验,看看哪个适合自己。。

这个就是带有自加Id的。。。也是野路子。
[mw_shl_code=csharp,true]class Robot : IDisposable
{
static private int IdNext = 0;
static private int IdOfDestroy = -1;

public int RobotID
{
get;
private set;
}

public Robot()
{
if(IdOfDestroy == -1)
{
this.RobotID = Robot.IdNext;
Robot.IdNext++;

}
else
{
this.RobotID = Robot.IdOfDestroy;
}
}

public void Dispose()
{
Robot.IdOfDestroy = this.RobotID;
}
}
[/mw_shl_code]


【二】通过 VisualTreeHelper,找到当前ItemsControl,通过IndexOf找到Index, 这种方式适合于ViewModel,有些ViewModel是全局的可以考虑。
绑定数据到Tag,从数据源上获取Index也是可以得。但是这样的话,就必须是用全局的ViewModel.

最后就变成这样了,哈哈,DataTemplate就可以愉快的使用了,通过复杂的Conventer,可以欢乐的实现自己的想法咯
[mw_shl_code=html,true]<DataTemplate>
<TextBlock Text="{Binding index,
RelativeSource={RelativeSource TemplatedParent},
StringFormat={}Index is {0}}">
</TextBlock>
</DataTemplate>[/mw_shl_code]

可以这样
***图片停止解析***

当然您也可以通过 ListBox的 SelectIndex,来实现自己一些像要的功能,如果强调数据的行为的话,可以考虑在DataTemplate上实现,因为很有可能不仅仅是被选择,也有当前下一个,当前上一个。
这个例子就是 音频在播放分,在数据中分析index, 在VisualTreeHelper中分析位置。 高亮或者往上移动。
***图片停止解析***

敬告:
为防止不可控的内容风险,本站已关闭新用户注册,新贴的发表及评论;
你现在看到的内容只是互联网用户曾经发表的言论快照,仅用于老用户留存纪念,且仅与科技行业相关,全部内容不代表本站观点及立场;
本站重新开放前已针对包括用户隐私、版权保护、信息安全、国家政策在内的各种互联网法律法规要求,执行了隐患内容的自查、屏蔽和删除;
本站目前所属个人主体,未有任何盈利安排与计划,且与原WFUN.COM所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
全部回复:
H****王 UID.1142783
2015-12-19 使用 Lumia 930 回复

太专业。。

2015-12-19 回复

想知道第几个一般绑定Tag或者重写Item

qiqiminmin UID.638527
2015-12-19 回复

本帖最后由 qiqiminmin 于 2015-12-19 23:57 编辑

Quote***链接停止解析***
想知道第几个一般绑定Tag或者重写Item


还有注意一下我的提到的环境,

我主要是想在DataTemplate里面知道 index............

如果你数据绑定之后,比如你的TextBlock显示,“我是第X个item”. 绑定在Tag上并不能帮助item自己知道自己是第几个, 不过在Conventer里面通过全局变量判断index了。

当然如果你是要,某个item因为 Tapped触发之后,不通过绑定的Tag,直接通过VisualTreeHelper也可以帮你找到相应信息。

vbfool UID.352791
2015-12-20 回复

还是数据源里提供更好一些,像这种列表项,我的做法就是给Item做ViewModel,把数据包在里边,这样的话,index可以用Linq很方便的生成,还可以加一些额外的Command什么的进去。

qiqiminmin UID.638527
2015-12-20 回复

Quote***链接停止解析***
还是数据源里提供更好一些,像这种列表项,我的做法就是给Item做ViewModel,把数据包在里边,这样的话,ind ...


嗯,微软的listbox其实就是这种方法的。非常适合在ViewModel设定一个Index.

2015-12-20 回复

本帖最后由 彼岸ˊ花的回忆 于 2015-12-20 13:14 编辑

Quote***链接停止解析***
还有注意一下我的提到的环境,

我主要是想在DataTemplate里面知道 index............


逐个添加Item,不过逐个添加Item绑定效率有点低,不过好处是可以随便重写Item,遇到对效率要求高的我一般是再建一个字典,用ID索引Index;

tmp00000 UID.995403
2015-12-21 回复

从ViewModel查SelectedItem就行了。具体怎么查得看数据有多少。

本站使用Golang构建,点击此处申请开源鄂ICP备18029942号-4联系站长投诉/举报