我正在尝试使车轮旋转。我有5个自定义的文本块,即带有值列表的文本文件(它可能包含1-1000个项目)。读取文件后,我有一个'List fileValues'及其值。我决定创建另一个“列表轮”,该列表轮一次最多包含5个元素,并有望绑定到文本块。
当按下旋转按钮时,将删除“ wheel”的最后一个元素,并将“ values”中的新元素添加到“ wheel”列表的开头。
为了使UI能够响应列表中的更改,最好将“滚轮”中的每个元素绑定到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”,但是效果是一样的。用户界面上未显示任何内容。实际上,我无法想象如何将每个List元素绑定到特定的Label。甚至有可能进行这种绑定吗?
在XAML中执行以下操作:
<Label Name="some_name" Content="{Binding SomeStingProperty}"/>
在后面的代码中,有一个
public string SomeStringProperty {get; set;}
您也可以绑定到集合,如果是集合,ObservableCollection
它将在更改时更新。
搜索基本的XAML绑定,否则:)
(附带说明,它更干净,我认为它是XAML,我个人不喜欢在后面的代码中使用它...)
作为附带说明,并且完全自我宣传,这里有2篇文章可能会有所帮助:
如果您是初学者,第二个可能会有点过头,但是仍然值得一读。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句