UI野路子 --- 【三】Item 的选择
本帖最后由 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所属公司不存在任何关联关系;
如果本帖内容或者相关资源侵犯到您的合法权益,或者您认为存在问题,那么请您务必点此举报或投诉!
本帖最后由 qiqiminmin 于 2015-12-19 23:57 编辑
Quote***链接停止解析***
想知道第几个一般绑定Tag或者重写Item
还有注意一下我的提到的环境,
我主要是想在DataTemplate里面知道 index............
如果你数据绑定之后,比如你的TextBlock显示,“我是第X个item”. 绑定在Tag上并不能帮助item自己知道自己是第几个, 不过在Conventer里面通过全局变量判断index了。
当然如果你是要,某个item因为 Tapped触发之后,不通过绑定的Tag,直接通过VisualTreeHelper也可以帮你找到相应信息。
还是数据源里提供更好一些,像这种列表项,我的做法就是给Item做ViewModel,把数据包在里边,这样的话,index可以用Linq很方便的生成,还可以加一些额外的Command什么的进去。
Quote***链接停止解析***
还是数据源里提供更好一些,像这种列表项,我的做法就是给Item做ViewModel,把数据包在里边,这样的话,ind ...
嗯,微软的listbox其实就是这种方法的。非常适合在ViewModel设定一个Index.
本帖最后由 彼岸ˊ花的回忆 于 2015-12-20 13:14 编辑
Quote***链接停止解析***
还有注意一下我的提到的环境,
我主要是想在DataTemplate里面知道 index............
逐个添加Item,不过逐个添加Item绑定效率有点低,不过好处是可以随便重写Item,遇到对效率要求高的我一般是再建一个字典,用ID索引Index;