2015-08-08 2 views
0

Я пытаюсь сделать какое-то колесо, вращающееся. У меня есть 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 с конкретным ярлыком. Возможно ли такое связывание?

+0

Почему вы не связываете в xaml свойства p1 ... p5 и не устанавливаете их там, где они вам нужны? – Noctis

+0

@Noctis Hm, на самом деле я все еще новичок в привязке данных в WPF. И самый понятный способ привязки данных, для меня на данный момент, - это код. Не могли бы вы порекомендовать некоторые источники или описать словами, как это можно сделать в xaml? – Dragon

ответ

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.

Второй может быть немного над вашей головой, если вы новичок, но, тем не менее, стоит прочитать.

+0

Если я правильно понимаю, мне нужно создать в моем случае 5 свойств, которые будут получать разные элементы из списка и исключать catch (если есть). Связывание будет выполнено в XAML? – Dragon

+0

Да, вы можете это сделать, или если вы хотите показать 5 в одном элементе управления (ярлык/текстовое поле и т. Д.), Вы можете привязать к наблюдаемому свойству коллекции и просто обновить коллекцию с помощью пяти элементов. – Noctis