XPath:绑定到最后一个集合项

时间:2012-10-08 09:29:48

标签: wpf binding

Bind TextBox.Text可以ObservableCollection<string>的最后一项吗?

我试过了:

<TextBox Text={Binding XPath="Model/CollectionOfString[last()]"/>

但它没有约束力。

谢谢。

2 个答案:

答案 0 :(得分:1)

请尝试以下方法,

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>

答案 1 :(得分:1)

它没有绑定,因为你不能在非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();

请注意,如果在集合中添加或删除项目,则不一定会自动调整当前项目指针。