绑定ObservableCollection< Item>到文本框(UWP)
本文关键字:UWP 文本 ObservableCollection Item 绑定 | 更新日期: 2023-09-27 18:15:50
我想实现单向绑定从一个ObservableCollection的"类结构"项目到一个TextBox有一个TextChanged事件。这个想法是,当Item的Comments字段在TextBox中累积时,TextBox会自动向下滚动,以便最后一行始终在视图中。集合被绑定到一个ListView,但我希望它绑定到只读的文本框。我不想在ResultViewModel中添加另一个方法,但在XAML中这样做。我该怎么做呢?TIA
// ViewModel
public class Item
{
public string First { get; set; }
public string Last { get; set; }
public string Comments { get; set; }
}
public class ResultViewModel
{
private ObservableCollection<Item> items = new ObservableCollection<Item>();
public ObservableCollection<Item> Items { get { return items; } }
// member functions
}
public ResultViewModel ViewModel { get; set; }
// What I have
<ListView x:Name="myListView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{x:Bind ViewModel.Items}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Item">
<StackPanel>
<TextBox Text="{x:Bind First}"/>
<TextBlock Text="{x:Bind Last}"/>
<TextBlock Text="{x:Bind Comments}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
// What I want
<TextBox Text="{x:Bind Comments}"/>
恐怕您不能单独使用XAML。您可以创建一个行为,它将监听事件,并在修改集合时向文本框添加行。
肮脏的例子,你将需要包括Microsoft.Xaml.Behaviors.Uwp.Managed包:
public class CommentsBehavior : Behavior
{
public ObservableCollection<string> Comments ... // you will need to make it a dependency property
protected virtual void OnAttached()
{
Comments.CollectionChanged += OnCollectionChanged;
}
protected virtual void OnDetaching()
{
Comments.CollectionChanged -= OnCollectionChanged;
}
private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.NewItems != null)
{
foreach(string newItem in e.NewItems)
{
((TextBox)AssociatedObject).Text = ((TextBox)AssociatedObject).Text + ''n' + newItem;
}
}
}
}
和滚动- UWP c#滚动到文本框的底部
但是为什么要使用文本框呢?使用list更有意义。