我正试图让某种轮子旋转。我有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。甚至可以做这样的约束吗?
答案 0 :(得分:2)
在XAML中执行以下操作:
<Label Name="some_name" Content="{Binding SomeStingProperty}"/>
并在后面的代码中,有一个
public string SomeStringProperty {get; set;}
你也可以绑定到一个集合,如果它是ObservableCollection
,它将在更改时更新。
搜索基本的XAML绑定,否则:)
(旁注,它更清洁,我认为是XAML,我个人不喜欢在后面的代码中做到这一点......)
作为旁注,完全自我推销,这里有2篇文章可能有所帮助:
如果你是初学者,第二个可能会有点过头但是应该值得一读。