作为大数据模型的一部分,我需要显示/编辑定义为ObservableCollection<String>
的字符串集合。在原型应用中,我们使用列表视图来显示整个集合,并使用文本框来编辑所选元素。文本框应绑定到集合的当前元素。由于GUI可能会发生变化,因此我无法使用<TextBox Text="{Binding SelectedItem,ElementName=listView}" />
直接绑定。
我尝试使用
<TextBox Text="{Binding Path=/, UpdateSourceTrigger=PropertyChanged}"/>
但它只能在一个方向上工作,更改listview当前项会导致更新文本框,但不会更新。
如何将文本框直接绑定到字符串集合中当前元素的sting实例?
答案 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会反映该值。希望这是有道理的。