2016-05-20 75 views
1

我有兩種類型的網站列表,我用下面的代碼是過濾視圖模型裏面現在過濾的視圖模型的數據後,它沒有顯示/刷新視圖

public void FilterSite() 
    { 
     if (SelectedItem.Contains("EC350")) 

      listofsites = new ObservableCollection<SiteDetails>(listofsites.Where(p => Convert.ToString(p.DeviceType) == "MiCell_Ec350")); 
     else if (SelectedItem.Contains("MiCell")) 
      listofsites = new ObservableCollection<SiteDetails>(listofsites.Where(p => Convert.ToString(p.DeviceType) == "MiCell")); 
     else if (SelectedItem.Contains("Mini-Max")) 
      listofsites = new ObservableCollection<SiteDetails>(listofsites.Where(p => Convert.ToString(p.DeviceType) == "Mini-Max")); 


    } 

獲取自動更新listofsites我實現INotifyPropertyChanged的OnPropertyChanged裏面的屬性setter

public class SiteMainUC_VM : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 


    private ObservableCollection<SiteDetails> listofsites = null; 
    public ObservableCollection<SiteDetails> Listofsites 
    { 
     get 
     { 
      return listofsites; 
     } 
     set 
     { 
      listofsites = value; 
      OnPropertyChanged("Listofsites"); 
     } 
    } 

組合框正在選擇值後,通過調試我看到過濾的值,但未顯示視圖。現在爲綁定我已經嘗試單向/雙向但都不工作。下面是XAML代碼 -

<ComboBox Name="cmbSiteSearch" SelectedValue="{Binding SelectedItem, Mode=TwoWay}" Text="{Binding SearchFilter,UpdateSourceTrigger=PropertyChanged}" Height="18" Width="18" IsReadOnly="True" FontFamily="Arial" > 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="SelectionChanged"> 
         <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
       <ComboBox.Background> 
        <ImageBrush ImageSource="/MasterLink;component/Resources/i_filter.png" /> 
       </ComboBox.Background> 
       <ComboBoxItem Content="All" Height="34" Width="190" FontFamily="Arial" FontSize="12" /> 
       <ComboBoxItem Content="EC350" Height="34" Width="190" FontFamily="Arial" FontSize="12"/> 
       <ComboBoxItem Content="Mini-Max" Height="34" Width="190" FontFamily="Arial" FontSize="12"/> 
      </ComboBox> 

現在對於站點列表列表框代碼中,我有

<ListBox ItemsSource="{Binding Listofsites}" SelectedItem="{Binding Path=Selectedsites, Mode=TwoWay,NotifyOnSourceUpdated=True}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="600" 
      SelectionChanged="ListBox_SelectionChanged" > 
+0

使用Observable集合,您不必實現OnPropertyChanged,而應該使用Collection.Clear()。並將所有新項目添加到Collection.Add(filteredItem) –

+0

嘗試。但沒有得到。 – user3165200

+0

您是否在子視圖模型上也做了同樣的通知事項,即SiteDetails –

回答

1
public void FilterSite() 
    { 
    listofsites = new ObservableCollection<SiteDetails>(parameters); 

if (SelectedItem.Contains("EC350")) 

      Listofsites = new ObservableCollection<SiteDetails>(listofsites.Where(p => Convert.ToString(p.DeviceType) == "MiCell_Ec350")); 
     else if (SelectedItem.Contains("MiCell")) 
      Listofsites = new ObservableCollection<SiteDetails>(listofsites.Where(p => Convert.ToString(p.DeviceType) == "MiCell")); 
     else if (SelectedItem.Contains("Mini-Max")) 
      Listofsites = new ObservableCollection<SiteDetails>(listofsites.Where(p => Convert.ToString(p.DeviceType) == "Mini-Max")); 


    } 

1)內部過濾方法添加私人可變因素與觀察到的集合綁定,否則一旦你過濾你的價值,它的價值將是無效的,並通過點擊第二次您不會通過篩選獲得任何值更改。

2)有時分配私有變量這裏listofsites不會給你想要的結果,並會出現問題,通過以視圖模型通信。雖然這是一種不好的編碼風格,但它使用直接屬性名稱而不是變量是快捷方式和有用的,I,e; Listofsites

3)我也有幾次面臨這種類似的視圖刷新問題。爲了更好的風格,你應該去MessageBus架構風格。發佈/訂閱風格可以實現與vm進行通信以便vm或vm進行查看。

下面https://msdn.microsoft.com/en-us/library/ff647328.aspx

希望這有助於鏈接。

0

你忘了你的組合框的的ItemsSource綁定到底層集合。你的XAML應該是這個樣子:

<ComboBox x:Name="cmbSiteSearch" Height="18" Width="18" 
      IsReadOnly="True" FontFamily="Arial" 
      Text="{Binding SearchFilter, UpdateSourceTrigger=PropertyChanged}" 
      ItemsSource="{Binding Listofsites}"/> 
+0

已經是listbox [所有站點列表]包含'ItemsSource =「{Binding Listofsites}」',這就是爲什麼如果我把同樣的東西給組合框,它會給出錯誤。 – user3165200

+0

如果沒有完整的上下文,仍然很難理解這個問題。你確定你正確設置DataContext?在FilterSite()方法中,您將值指定給listofsites字段而不是Listofsites屬性,該屬性不會導致OnPropertyChanged調用。 –

相關問題