将List <string>的元素绑定到文本块

时间:2015-08-08 13:49:50

标签: c# wpf data-binding

我正试图让某种轮子旋转。我有5个自定义文本块,带有值列表的文本文件(可能包含1-1000个项目)。读完文件后,我有一个'List fileValues'及其值。我决定创建另一个'List wheel',当时最多包含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。甚至可以做这样的约束吗?

1 个答案:

答案 0 :(得分:2)

在XAML中执行以下操作:

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

并在后面的代码中,有一个

public string SomeStringProperty {get; set;}

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

搜索基本的XAML绑定,否则:)

(旁注,它更清洁,我认为是XAML,我个人不喜欢在后面的代码中做到这一点......)

作为旁注,完全自我推销,这里有2篇文章可能有所帮助:

  1. Understanding selected value
  2. The big mvvm template
  3. 如果你是初学者,第二个可能会有点过头但是应该值得一读。