绑定List到文本块

本文关键字:文本 string List 绑定 | 更新日期: 2023-09-27 18:07:03

我正在尝试做一些车轮旋转。我有5个自定义文本块,文本文件与值的列表(它可能包括1-1000项)。阅读文件后,我有一个"列表filevalvalues"与它的值。我决定创建另一个"列表轮",它将包含多达5个元素,预计将被绑定到文本块。

当按下旋转按钮时,'wheel'的最后一个元素被删除,'values'中的新元素被添加到'wheel'列表的开始。

为了让UI对列表中的变化做出响应,最好将"wheel"中的每个元素绑定到UI上相应的文本块。但到目前为止,我所做的一切都没有成功。

这是我尝试做的(代码有点脏,但我先试着让它工作)。

5个自定义文本块

<TextBlock Name="Value1" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value2" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value3" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value4" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value5" TextWrapping="WrapWithOverflow"/>

实现INotifyCollectionChanged接口的ObservableList

class ObservableList : INotifyCollectionChanged, IEnumerable
{
    private readonly List<string> _valuesList;
    public string First
    {
        get { return _valuesList.First(); }
    }
    public string Last
    {
        get { return _valuesList.Last(); }
    }
    public ObservableList()
    {
        this._valuesList = new List<string>();
    }
    public string this[Int32 index]
    {
        get
        {
            if (_valuesList.Count == 0 || index + 1 > _valuesList.Count)
            {
                return "------";
            }
            return _valuesList[index];
        }
    }
    public void AddLast(string value)
    {
        _valuesList.Add(value);
        OnNotifyCollectionChanged();
    }
    public void AddFirst(string value)
    {
        _valuesList.Insert(0, value);
        OnNotifyCollectionChanged();
    }
    public void RemoveFirst()
    {
        _valuesList.RemoveAt(0);
        OnNotifyCollectionChanged();
    }
    public void RemoveLast()
    {
        _valuesList.Remove(_valuesList.Last());
        OnNotifyCollectionChanged();
    }
    public event NotifyCollectionChangedEventHandler CollectionChanged;
    public void OnNotifyCollectionChanged()
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    }
    public IEnumerator GetEnumerator()
    {
        return (_valuesList as IEnumerable).GetEnumerator();
    }
}

XAML后台代码

public partial class MainWindow : Window
{
    private List<string> _values = new List<string>();
    private ObservableList _uiValues = new ObservableList();
    public MainWindow()
    {
        InitializeComponent();
        Value1.DataContext = _uiValues[0];
        Value2.DataContext = _uiValues[1];
        Value3.DataContext = _uiValues[2];
        Value4.DataContext = _uiValues[3];
        Value5.DataContext = _uiValues[4];
    }
    private void LoadFileBtn_Click(object sender, RoutedEventArgs e)
    {
        //Loads text file and fills _values
    }
    private void SpinBtn_Click(object sender, RoutedEventArgs e)
    {
        InitUiTextBlocks();
        //Spin simulation
    }
    private void InitUiTextBlocks()
    {
        _uiValues.Clear();
        for (int i = 0; i < 5; ++i)
        { 
            //Nothing appears on UI and CollectionChanged event is null
            _uiValues.AddLast(_values.First());
            _values.RemoveAt(0);
        }
    }
}

我尝试使用'ObservableCollection',但效果是一样的。UI上什么也没有显示。事实上,我无法想象如何将每个List元素绑定到特定的Label。这样的绑定有可能实现吗?

绑定List<string>到文本块

在XAML中执行如下操作:

<Label Name="some_name" Content="{Binding SomeStingProperty}"/>

后面的代码中,有一个

public string SomeStringProperty {get; set;}

你也可以绑定到一个集合,如果它是一个ObservableCollection,它会在变化时更新。

查找基本的XAML绑定,否则:)

(顺便说一句,它更干净,我认为它是XAML,我个人不喜欢在后面的代码中这样做…)

作为一个旁注,完全是自我推销,这里有两篇文章可能会有所帮助:

  1. 理解所选值
  2. mvvm大模板。

如果你是初学者,第二个可能有点难理解,但无论如何都值得一读。