绑定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。这样的绑定有可能实现吗?
在XAML中执行如下操作:
<Label Name="some_name" Content="{Binding SomeStingProperty}"/>
在后面的代码中,有一个
public string SomeStringProperty {get; set;}
你也可以绑定到一个集合,如果它是一个ObservableCollection
,它会在变化时更新。
查找基本的XAML绑定,否则:)
(顺便说一句,它更干净,我认为它是XAML,我个人不喜欢在后面的代码中这样做…)
作为一个旁注,完全是自我推销,这里有两篇文章可能会有所帮助:
- 理解所选值
- mvvm大模板。
如果你是初学者,第二个可能有点难理解,但无论如何都值得一读。