2015-08-21 3 views
0

Я знаю, что должен использовать шаблон MVVM, но я пытаюсь получить шаг за шагом ближе к нему. Так вот мой Listbox:ObservableCollection привязка к listbox ui не обновляется

<ListBox x:Name="BoardList" ItemsSource="{Binding notes}" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 
          <TextBox IsReadOnly="True" ScrollViewer.VerticalScrollBarVisibility="Visible" Text="{Binding text}" TextWrapping="Wrap" Foreground="DarkBlue"></TextBox> 
          <AppBarButton Visibility="{Binding visibility}" Icon="Globe" Click="OpenInBrowser" x:Name="Link"></AppBarButton> 
          <AppBarButton Icon="Copy" Click="Copy"></AppBarButton> 
          <AppBarButton Icon="Delete" Click="Delete"></AppBarButton> 
         </StackPanel> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

В MainPage.xaml.cs я заявляю следующее:

ObservableCollection<BoardNote> notes = new ObservableCollection<BoardNote>(); 

Так что, если я понял это право мне не нужно заботиться о «INotifyCollectionChanged» потому что я использую наблюдаемый коллектив? Так что я получил, например, текстовое поле, как это:

<Textbox x:Name="UserInputNote" Placeholdertext="Type in a text for your note"></Textbox> 

и кнопка Добавить новую ноту в ObservableCollection и событие щелчка так же, как это:

notes.Add(new BoardNote(UserInputNote.Text)); 

Так что теперь интерфейс должен обновлять каждый раз, когда пользователь нажимает кнопку, чтобы сохранить новую заметку. Но ничего не происходит. Что я сделал не так?

Если вам это нужно здесь класс BoardNote:

class BoardNote 
{ 
    public string text 
    { 
     get; set; 
    } 
     public BoardNote(string text) 
    { 
     this.text = text; 
    } 
    public Visibility visibility 
    { 
     get 
     { 
      if (text.StartsWith("http")) 
       return Visibility.Visible; 
      else 
       return Visibility.Collapsed; 
     } 
    } 
} 
+0

Вам нужно реализовать NotifyPropertyChanged для ObservableCollection –

+0

@MichalKozak могли бы вы написать строку кода для меня, чтобы понять это? У меня проблемы с методом propertychanged ... –

ответ

0

Вы должны реализовать INotifyPropertyChanged. Вот один из способов сделать это.

Создайте этот класс NotificationObject.

public class NotificationObject : INotifyPropertyChanged 
{ 
    protected void RaisePropertyChanged<T>(Expression<Func<T>> action) 
    { 
     var propertyName = GetPropertyName(action); 
     RaisePropertyChanged(propertyName); 
    } 

    private static string GetPropertyName<T>(Expression<Func<T>> action) 
    { 
     var expression = (MemberExpression)action.Body; 
     var propertyName = expression.Member.Name; 
     return propertyName; 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Тогда ваш класс BoardNote унаследует это так:

class BoardNote : NotificationObject 
{ 
private string _text 
public string Text 
{ 
    get {return _text;} 
    set 
    { 
    if(_text == value) return; 
    _text = value; 
    RaisePropertyChanged(() => Text); 
    } 
} 
    public BoardNote(string text) 
{ 
    this.text = text; 
} 
public Visibility visibility 
{ 
    get 
    { 
     if (text.StartsWith("http")) 
      return Visibility.Visible; 
     else 
      return Visibility.Collapsed; 
    } 
} 
} 
+0

Спасибо, что помогли мне –

Смежные вопросы