绑定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}"/>

绑定ObservableCollection< Item>到文本框(UWP)

恐怕您不能单独使用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更有意义。