2015-08-23 91 views
0

該問題已在標題中進行了解釋。請仔細查看XAML和代碼,因爲我是C#中的一名業餘愛好者(只有基本知識),並且幾乎是全新的Data Binding。因此,這裏是我的XAML:帶有數據綁定到ObservableCollection的列表框不會更新UI

public sealed partial class MainPage : Page 
{ 
    ObservableCollection<BoardNote> notes = new ObservableCollection<BoardNote>(); 

    public MainPage() //empty for post 
    { 
     this.InitializeComponent(); 
    }} 

BoardNote

class BoardNote : NotificationObject 
{ 

    private string _text { get; set; } 
    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; 
     } 
    } 
} 

而且Notification類:

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; 
} 

<ListBox x:Name="BoardList" ItemsSource="{Binding notes, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" > 
      <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

如果我創建了新的BoardnoteListbox在按鈕上不添加新項目。我不知道該怎麼做,我是新來的,但我很快就瞭解新事物。

+0

您是否定義了Datacontext在頁面中? (綁定獲取內容) –

+0

@JuanPabloGarciaCoello我忘了,現在我調整它:DataContext =「{綁定說明,模式= OneWay,UpdateSourceTrigger = PropertyChanged}」,但它仍然無效,數據上下文有什麼區別和itemsource? –

回答

0

1.- DataContext是一個包含您需要的數據的類的實例。 您可以設置類似的DataContext:

<Page xmlns:local...> 
    <Page.DataContext> 
     <local:ViewModelClass/> 
    </Page.DataContext>  

(您可以通過多種方式做這,作爲一種資源和其他許多東西)

2:類ViewModelClass應該包含一個屬性叫做內容,都成爲一個財產。

public ObservableCollection<BoardNote> Notes {get;} = new ObservableCollection<BoardNote>(); 

3.-如果您需要更新數據,請不要恢復注意事項,只需清除它和讀取的項目。

4.-有趣的是實現INotifyPropertyChanged使UI刷新視圖與新的數據。

UPDATE:

如果您在DataContext設置到Notes的一個實例:

<ListBox x:Name="BoardList" ItemsSource="{Binding}"> 
<ListBox.DataContext> 
    <local:Notes/> 
</ListBox.DataContext/> 

...

但是,正如你可以看到它是一個有點困難,因爲Notes應您可以從ObservableCollection繼承的類:

public class Notes : ObservableCollection<Note> 
{ 
} 
+0

所以你認爲我應該設置datacontext = null;並且比datacontext = notes;如果我得到你的權利?我認爲這是做錯的方式,因爲我需要太多的系統資源? –

+0

如果我例如有一個列表與YouTube視頻與預覽圖片我從webrequest得到,我重新列表我重新下載每張圖片。@JuanPabloGarciaCoello –

+0

不,我沒有說設置爲空,然後設置爲一個值,只需設置值,但如果您選擇datacontext註釋,ItemsSource只是綁定 –

相關問題