2013-01-04 76 views
2

我有一個靜態的IList充當靜態類的存儲庫:爲什麼不通過RaisePropertyChanged進行UI更新?

//靜態類設置

public static IList RecentSearchedRepo = new ObservableCollection<object>(); 

,位於我結合我的UI格到另一個階級一個IList:

//組件類

​​

我對象添加到RecentSearchedRepo:

RecentSearchedRepo.add(searchitem) 

然後設置RecentSearch到靜態列表

RecentSearch = Settings.RecentSearchedRepo; 

XAML片段:從RecentSearchGrid類

<GridLayout:RecentSearchGrid x:Name="recentSearchGrid" ItemsSource="{Binding RecentSearch}" /> 

片斷延伸用戶控件:

public IList ItemsSource 
{ 
    get 
    { 
     return GetValue(ItemsSourceProperty) as IList; 
    } 
    set 
    { 
     SetValue(ItemsSourceProperty, value); 
    } 
} 

private static readonly DependencyProperty ItemsSourceProperty = 
        DependencyProperty.Register("ItemsSource", typeof(IList), typeof(RecentSearchGrid), new PropertyMetadata(null, OnItemsSourcePropertyChanged)); 


private static void OnItemsSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    RecentSearchGrid source = d as RecentSearchGrid; 

    if (source != null) 
    { 
     source.setListforgrid(source.ItemsSource); 
    } 
} 

是該問題時,我將第一項添加到RecentSearchedRepo UI已更新,但是在隨後的每一次添加中,UI都不會更新。

+0

你有沒有想過將公共靜態IList改爲受保護的靜態IList,這也是一個winform或asp.net ..? – MethodMan

+0

@DJKRAZE,C#。不是基於表單或網絡的。該代碼旨在在XBOX控制檯上運行。另外,從公開到保護的變化在綁定時也會產生影響。 – Fabii

+0

當您設置新列表時,而不是當前列表被修改時,您當前正在引發該事件。收藏被修改時,您需要觸發適當的事件。 – Servy

回答

1

相反的:

RecentSearch = Settings.RecentSearchedRepo; 

嘗試這樣做:

RecentSearch.Clear(); 
var freshData = Settings.RecentSearchedRepo; 
if (freshData != null) 
    foreach (var item in freshData) 
     RecentSearch.Add(item); 

你殺了重新分配的參考的綁定。

編輯:你

你倒着做後:那OnItemsSourcePropertyChanged不應設置源,它不應該出現在所有實際。
你必須綁定,在RecentSearchGrid.xaml,在RecentSearchGrid.xaml.cs

+1

我不確定是這種情況。 'RecentSearch'不是一個依賴項屬性,因此沒有分配給它的綁定。相反,它是一個具有約束力的來源,可以在更改時正確通知。 –

+0

我正在等待他對此的反饋,因爲他的XAML中的ItemsSource是他公開的自定義屬性。現在,事實是顯示了第一個被分配的引用,所以如果他總是保持相同的引用,它應該工作。 –

+0

好點。問題可能是從UserControl派生的RecentSearchGrid b/c的實現,而不是ItemsControl(它將保證正確的ItemsSource語義)。 –

0

我不認爲這裏有足夠的信息來回答您的問題聲明的ItemsSource依賴屬性。下面簡單的應用程序鏡子,我看到在這個問題中描述的場景,它按預期工作:

// MySettings.cs 
public static class MySettings 
{ 
    public static IList RecentSearchedRepo = new ObservableCollection<object>(); 
} 

// MyVm.cs 
public class MyVm : INotifyPropertyChanged 
{ 
    private IList recentSearch = new ObservableCollection<object>(); 

    public event PropertyChangedEventHandler PropertyChanged; 

    public MyVm() 
    { 
     this.RecentSearch = MySettings.RecentSearchedRepo; 
    } 

    public IList RecentSearch 
    { 
     get { return recentSearch; } 
     set 
     { 
      recentSearch = value; 
      this.RaisePropertyChanged("RecentSearch"); 
     } 
    } 

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

// MainWindow.xaml.cs 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     this.InitializeComponent(); 

     // Initialization as described in the question 
     MySettings.RecentSearchedRepo.Add("SearchItem1"); 
     MySettings.RecentSearchedRepo.Add("SearchItem2"); 

     this.DataContext = new MyVm(); 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     // Add a new item later 
     MySettings.RecentSearchedRepo.Add("NewlyAddedSearchItem"); 
    } 
} 

// MainWindow.xaml 
<Window x:Class="ScratchWpf.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel> 
     <Button DockPanel.Dock="Bottom" Content="Add new Search Item" Click="Button_Click_1" /> 
     <ListBox ItemsSource="{Binding RecentSearch}" /> 
    </DockPanel> 
</Window> 

我會嘗試把我的心靈的帽子,並詢問是否,也許,您要添加其他項目錯誤的收集。在添加單個項目後,集合是否會重新創建並置於綁定中,但後來的項目會添加到原始集合中而不是新的集合中?

鑑於您聲明瞭RecentSearchGrid是一個UserControl,我們還可以推斷ItemsSource的實現可能是一個自定義的實例,而不是從ItemsControl繼承的標準實例。 RecentSearchGrid可能會以某種方式錯誤地破壞綁定。

我同意狒狒。 OnItemsSourcePropertyChanged的目的是什麼?在典型的實施中,我不希望那樣。

+0

每次添加後我都會收集大小的集合,並且它反映該對象實際上正在被添加。用戶界面只是不更新​​。 – Fabii

+0

哪個集合是你傾銷的大小?如果您在添加聲明後立即傾倒大小,那麼證明什麼都不是,因爲_course_是您添加項目的地方。我的問題是,這是否是你必須的_same_集合。您的PropertyChanged事件多久爲該集合引發? –

+0

每次我做任務時都會引發PropertyChanged最近搜索=設置.RecentSearchedRepo;我轉儲了RecentSearch和RecentSearchedRepo的大小。 – Fabii

0

問題可能如下: 如果實例沒有更改,OnItemsSourcePropertyChanged將不會被調用。 從WPF的角度來看,當你RaisePropertyChangeEvent,但綁定集合的實例沒有改變時,PropertyChange處理程序根本不會被調用。

Settings.RecentSearchedRepo通過應用程序的生命週期相同的實例嗎?

+0

是的,它應該是相同的實例通過應用程序的生命週期。 – Fabii

+0

然後嘗試做一些像RecentSearch = new ObservableCollection <...>(Settings.RecentSearchedRepo);並看看它是否有效 –

+0

ObservableCollection不允許帶有1個參數的構造函數。這不是Wpf,而是Xbox的C#。 – Fabii

相關問題