1

Bind TextBox.Textの最後のアイテムにできますObservableCollection<string>か?

私はこれを試しました:

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

しかし、それはバインドされません。

ありがとうございました。

4

2 に答える 2

1

XPath非 XML データ ソースではプロパティを使用できないため、バインドされません。代わりに使用する必要がPathあり、そのプロパティは同様の構文を提供しません。したがって、最後の値のインデックスがわからない限り、コレクションの最後の要素に直接バインドすることはできません。ただし、利用可能な回避策がいくつかあります。

値コンバーターを使用してバインドする

コレクションを受け取り、それを最後の要素に「変換」するカスタム値コンバーターを作成することは難しくありません。ハワードの答えは、これを行うベアボーンコンバーターを提供します。

コレクション ビューの現在のアイテムにバインドする

これはさらに簡単に実行できますが、コード ビハインドが必要です。

デフォルトのコレクション ビューで「現在の」アイテムをコレクションの最後のアイテムに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();

コレクションにアイテムが追加または削除された場合、現在のアイテム ポインターが自動的に調整されるとは限らないことに注意してください。

于 2012-10-08T09:57:42.753 に答える
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>
于 2012-10-08T09:46:57.973 に答える