2016-04-11 2 views
-2

Итак, я нахожусь в упущенном состоянии и надеюсь на некоторое руководство. Я использую шаблон MVVM и EF.Найти элементы в ObservableCollection и обновить UI

My View содержит привязку данных, привязанную к наблюдаемой коллекции в модели представления. Пользовательский интерфейс дополнительно содержит 3 списков с возможными данными для сведения к минимуму показанных данных.

Таким образом, я искал поиск и не нашел ничего, что мог бы использовать (или, возможно, не понял его правильно).

Как выполнить поиск и выбор элементов из ObservableCollection и соответственно обновить datagrid?

public ObservableCollection<DimTargets> TargetParameters { get; set; } 
    private void SelectionChanged(object obj) 
    { 
     if (obj is FactTargets) 
     { 
      SelectedFactTarget = (FactTargets)obj; 
     } 
     else if (obj is DimLocation) 
     { 
      SelectedLocation = (DimLocation)obj; 
      ViewCollection.Select(x => x.Location == SelectedLocation.Location); 
      TargetParameters.Where(x => x.FactTargets == SelectedLocation.FactTargets); 
     } 
     else //DimBladeType 
     { 
      SelectedBladeType = (DimBladeType)obj; 
      int[] a = DimTargetsController.ReturnBladeType(SelectedBladeType); 
      foreach (int i in a) 
      { 
       TargetParameters.Single(k => k.ID == i); 
      } 
      var os = TargetParameters.Where(d => d.ID ==); 
      TargetParameters = Convert<DimTargets>(os); 
      //TargetParameters.Where(ka => ka.ID == a); 
      //TargetParameters = new ObservableCollection<DimTargets>(TargetParameters.Where(t => t.FactTargets == SelectedBladeType.FactTargets)); 
      //var obs = TargetParameters.Where(t => t.FactTargets == SelectedBladeType.FactTargets); 
      //TargetParameters = Convert<DimTargets>(obs); 
      //ViewCollection.Select(x => x.BladeType == SelectedBladeType.BladeType).ToList(); 
     } 
    } 

    public ObservableCollection<T> Convert<T>(IEnumerable original) 
    { 
     return new ObservableCollection<T>(original.Cast<T>()); 
    } 

XAML:

ComboBox ItemsSource="{Binding FactTargetCollection, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedFactTarget}" DisplayMemberPath="FYQuater" Behaivor:SelectionChangedBehaviour.Command="{Binding SelectionChangedCommand}"/> 
      <ComboBox ItemsSource="{Binding LocationCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedLocation}" DisplayMemberPath="Location" Behaivor:SelectionChangedBehaviour.Command="{Binding SelectionChangedCommand}"/> 
      <ComboBox ItemsSource="{Binding BladeTypeCollection, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedBladeType}" DisplayMemberPath="BladeType" Behaivor:SelectionChangedBehaviour.Command="{Binding SelectionChangedCommand}"/> 

      <Button Content="Submit" Style="{StaticResource BaseButtonStyle}"></Button> 
     </StackPanel> 

     <StackPanel x:Name="WorkPanel" DockPanel.Dock="Right"> 
      <DataGrid ItemsSource="{Binding TargetParameters}"> 

      </DataGrid> 
     </StackPanel>` 

Надеется, что это дает лучшее представление о том, что я пытаюсь сделать. код C# заполнен примерами с тем, что я пробовал.

+2

Пожалуйста, пост код – Eldho

+0

Вы спрашиваете, как выбрать строки в сетке данных на основе на собственность вашей viewmodel? [Это может помочь] (http://stackoverflow.com/a/4902454/424129) ('Selector' - это базовый класс' DataGrid', поэтому 'DataGrid' имеет свойство' SelectedItem', как 'ComboBox' и т. Д.). 'DataGrid.SelectionMode',' DataGrid.SelectionUnit' и 'DataGrid.SelectedCells' также могут быть полезны. –

+1

Вы назначаете новое значение «TargetParameters» без уведомления пользовательского интерфейса. Вам нужно запустить событие 'PropertyChanged' в настройке для« TargetParameters ». Какая цель используется в любом случае? Какова цель «TargetParameters.Single (k => k.ID == i);'? Этот вызов ничего не делает. 'TargetParameters.Where (x => x.FactTargets == SelectedLocation.FactTargets);' также ничего не делает. Вы запускаете 'PropertyChanged' в установщике для' SelectedLocation'? Если у вас нет события PropertyChanged, ваша модель просмотра должна реализовать 'INotifyPropertyChanged'. –

ответ

3

Бруса видеть вас все объекты, но здесь это быстрый п простой иллюстрации ...

public RelayCommand<int> FilterAgeCommand { get; set; } 

    public Base_ViewModel() 
    { 
     FilterAgeCommand = new RelayCommand<int>(OnFilterAgeCommand); 

     this.TestClassList = new ObservableCollection<TestClass>(); 

     this.TestClassList.Add(new TestClass() { FName = "John", SName = "Doe", Age = 25 }); 
     this.TestClassList.Add(new TestClass() { FName = "Jane", SName = "Doe", Age = 75 }); 
     this.TestClassList.Add(new TestClass() { FName = "Mick", SName = "Doe", Age = 35 }); 
     this.TestClassList.Add(new TestClass() { FName = "Harry", SName = "Doe", Age = 10 }); 
     this.TestClassList.Add(new TestClass() { FName = "Linda", SName = "Doe", Age = 25 }); 
     this.TestClassList.Add(new TestClass() { FName = "Fred", SName = "Doe", Age = 14 }); 

     this.FilteredTestClassList = new ObservableCollection<TestClass>(); 

     this.Age = new List<int>(); 
     for(int i = 1; i <100; i++) 
     { 
      this.Age.Add(i); 
     } 
    } 

    private void OnFilterAgeCommand(int obj) 
    { 
     this.FilteredTestClassList = Convert<TestClass>((from tc in this.TestClassList where tc.Age < obj select tc).ToList()); 
    } 

    public List<int> Age { get; set; } 

    public ObservableCollection<TestClass> TestClassList { get; set; } 

    private ObservableCollection<TestClass> _FilteredTestClassList; 

    public ObservableCollection<TestClass> FilteredTestClassList 
    { 
     get { return _FilteredTestClassList; } 
     set { _FilteredTestClassList = value; OnPropertyChanged("FilteredTestClassList"); } 
    } 

    public ObservableCollection<T> Convert<T>(IEnumerable original) 
    { 
     return new ObservableCollection<T>(original.Cast<T>()); 
    } 

Простого класса для демонстрации ...

public class TestClass : INotifyPropertyChanged 
{ 
private string _FName; 

public string FName 
{ 
    get { return _FName; } 
    set { _FName = value; NotifyPropertyChanged("FName"); } 
} 

private string _SName; 

public string SName 
{ 
    get { return _SName; } 
    set { _SName = value; NotifyPropertyChanged("FName"); } 
} 

private int _Age; 

public int Age 
{ 
    get { return _Age; } 
    set { _Age = value; } 
} 


public event PropertyChangedEventHandler PropertyChanged; 

private void NotifyPropertyChanged(String info) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 
} 
} 

И некоторые XAML ...

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:ViewModels="clr-namespace:_36550006.ViewModels" 
      xmlns:Views="clr-namespace:_36550006.Views" 
      xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
      Title="Base_View" Height="300" Width="300"> 


<Window.DataContext> 
    <ViewModels:Base_ViewModel/> 
</Window.DataContext> 

<Grid> 
    <StackPanel> 
     <DataGrid ItemsSource="{Binding FilteredTestClassList, NotifyOnSourceUpdated=True}"></DataGrid> 
     <ComboBox x:Name="cmb" ItemsSource="{Binding Age}" SelectedValuePath="{Binding Age}" > 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="SelectionChanged"> 
        <i:InvokeCommandAction Command="{Binding FilterAgeCommand}" CommandParameter="{Binding ElementName=cmb, Path=SelectedItem}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </ComboBox> 
    </StackPanel> 
</Grid> 

Я по существу есть два ObservableCollection, то первый имеет все ваши вопросы и второй представляет собой отфильтрованную коллекцию, что вы связываете с ....

+0

Большое спасибо, только что слепой и не понимая, что мне нужны 2 отдельных коллекции, 1 фильтрованный и нефильтрованный. –

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