Я пытаюсь сделать какое-то колесо, вращающееся. У меня есть 5 настраиваемых текстовых блоков, текстовый файл со списком значений (он может состоять из 1-1000 элементов). После прочтения файла у меня есть «Список файлов» с его значениями. Я решил создать еще одно «колесо списка», которое в то время будет содержать до 5 элементов и, как ожидается, будет привязано к текстовым блокам.Связать элементы списка <string> с текстовыми блоками
При нажатии кнопки поворота последний элемент «колеса» удаляется, а новый элемент из «значений» добавляется в начало списка «колесо».
Чтобы пользовательский интерфейс реагировал на изменения в списке, удобно привязывать каждый элемент в «колесе» к соответствующему текстовому блоку в пользовательском интерфейсе. Но то, что я пытался сделать до этого момента, не сработало.
Вот что я пытался сделать (код немного грязный, но я стараюсь заставить его работать во-первых).
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"/>
ObservableList который реализует интерфейс INotifyCollectionChanged
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 с конкретным ярлыком. Возможно ли такое связывание?
Почему вы не связываете в xaml свойства p1 ... p5 и не устанавливаете их там, где они вам нужны? – Noctis
@Noctis Hm, на самом деле я все еще новичок в привязке данных в WPF. И самый понятный способ привязки данных, для меня на данный момент, - это код. Не могли бы вы порекомендовать некоторые источники или описать словами, как это можно сделать в xaml? – Dragon