我想从ObservableCollection实现单向绑定" struct-like"具有TextChanged事件的TextBox的项目。这个想法是,当Item的Comments字段在TextBox中累积时,TextBox会自动向下滚动,以便最后一行始终在视图中。该集合绑定到ListView,但我希望它以只读方式绑定到TextBox。我不想在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}"/>
答案 0 :(得分:1)
我担心你不能单独使用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# Scroll to the bottom of TextBox
但为什么要使用文本框呢?使用列表更有意义。