【问题标题】:XPath : Bind to last item of collectionXPath:绑定到集合的最后一项
【发布时间】:2012-10-08 18:03:00
【问题描述】:

我可以Bind TextBox.TextObservableCollection<string> 的最后一项吗?

我试过了:

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

但它不绑定。

谢谢。

【问题讨论】:

标签: wpf binding


【解决方案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>

【讨论】:

  • 你的意思是使用XPath没有办法做到这一点?
  • :我需要TwoWay我可以ConvertBack吗?
  • 我不确定是否有使用 XPaht 的方法,但我确信您可以实现 ConvertBack 方法来进行双向绑定。请记住在 XAML 中添加双向绑定 :)
【解决方案2】:

它没有绑定,因为您不能在非 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
  • @Mohsen:根据您的代码结构,您可以在视图中执行相同的操作。否则,您始终可以将模型包装在 MVVM 样式的视图模型中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2021-07-12
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2010-09-17
相关资源
最近更新 更多