如何将TextBox绑定到纯字符串集合

时间:2009-11-09 08:31:19

标签: wpf data-binding textbox

作为大数据模型的一部分,我需要显示/编辑定义为ObservableCollection<String>的字符串集合。在原型应用中,我们使用列表视图来显示整个集合,并使用文本框来编辑所选元素。文本框应绑定到集合的当前元素。由于GUI可能会发生变化,因此我无法使用<TextBox Text="{Binding SelectedItem,ElementName=listView}" />直接绑定。

我尝试使用

<TextBox Text="{Binding Path=/, UpdateSourceTrigger=PropertyChanged}"/>

但它只能在一个方向上工作,更改listview当前项会导致更新文本框,但不会更新。

如何将文本框直接绑定到字符串集合中当前元素的sting实例?

1 个答案:

答案 0 :(得分:0)

好的,这是你的ListView。我要为它添加一个名称,以便我可以在XAML的其他地方引用它:

<ListView 
    x:Name=stringList
    ItemsSource="{Binding}" 
    SelectionMode="Single" 
    IsSynchronizedWithCurrentItem="True">
    <ListView.View>
        <GridView>
            <GridViewColumn 
                Header="Data Item" 
                Width="80" 
                DisplayMemberBinding="{Binding}"/>
        </GridView>
    </ListView.View>
</ListView>

现在,在右侧的TextBox中,您可以直接绑定到ListView:

<TextBox Text="{Binding SelectedItem,ElementName=stringList}" />

由于ListView直接绑定到字符串列表,因此SelectedItem将是当前所选ListViewItem指向的字符串。

<强>更新

由于您不允许使用ElementBinding,最好的办法是引入一个ViewModel类来放在列表和窗口之间。像这样定义:

public class StringListViewModel : INotifyPropertyChanged
{
    // you'll have to implement INotifyPropertyChanged - I won't
    // do that here - do a quick search to learn how it works.

    public ObservableCollection<String> List { get; set; }

    private object _si;
    public object SelectedItem
    {
        get { return _si; }
        set
        { 
            _si = value;
            OnPropertyChanged("SelectedItem");
        }
    } 
}

现在将窗口的DataContext设置为ViewModel类的实例,而不是将其直接指向字符串列表。将ListView的ItemsSource和SelectedItem绑定到它:

<ListView ItemsSource="{Binding List}" SelectedItem="{Binding SelectedItem}" ... />

现在将TextBox绑定到ViewModel的SelectedItem:

<TextBox Text="{Binding SelectedItem}" />

现在,无论何时更改,您的列表都会在ViewModel上设置SelectedItem,因此TextBox会反映该值。希望这是有道理的。