【发布时间】:2012-10-08 18:03:00
【问题描述】:
我可以Bind TextBox.Text 到ObservableCollection<string> 的最后一项吗?
我试过了:
<TextBox Text={Binding XPath="Model/CollectionOfString[last()]"/>
但它不绑定。
谢谢。
【问题讨论】:
我可以Bind TextBox.Text 到ObservableCollection<string> 的最后一项吗?
我试过了:
<TextBox Text={Binding XPath="Model/CollectionOfString[last()]"/>
但它不绑定。
谢谢。
【问题讨论】:
请尝试以下方法,
1、使用IValueConverter。
class DataSourceToLastItemConverter : IValueConverter
{
public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
IEnumerable<object> items = value as IEnumerable<object>;
if (items != null)
{
return items.LastOrDefault();
}
else return Binding.DoNothing;
}
public object ConvertBack(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new System.NotImplementedException();
}
}
然后像这样绑定:
<Grid>
<Grid.Resources>
<local:DataSourceToLastItemConverter x:Key="DataSourceToLastItemConverter" />
</Grid.Resources>
<TextBox Text="{Binding Path=Model.CollectionOfString,Converter={StaticResource DataSourceToLastItemConverter}}"/>
</Grid>
【讨论】:
XPath没有办法做到这一点?
TwoWay我可以ConvertBack吗?
它没有绑定,因为您不能在非 XML 数据源上使用 XPath 属性;您必须改用Path,并且该属性不提供类似的语法。所以你不能直接绑定到集合的最后一个元素,除非你知道最后一个值的索引。但是有几种解决方法:
编写自定义value converter 将集合“转换”为最后一个元素并不难。 Howard's answer 提供了一个准系统转换器。
这更容易做到,但它涉及代码隐藏。
如果您已将默认collection view 中的“当前”项设置为集合中的最后一项,则可以使用Path=Model.CollectionOfString/(注意末尾的斜线)进行绑定。在您的模型中执行此操作:
// get a reference to the default collection view for this.CollectionOfString
var collectionView = CollectionViewSource.GetDefault(this.CollectionOfString);
// set the "current" item to the last, enabling direct binding to it with a /
collectionView.MoveCurrentToLast();
请注意,如果在集合中添加或删除项目,则不一定会自动调整当前项目指针。
【讨论】:
CollectionView