在ObservableCollection中查找项目并更新UI

时间:2016-04-11 13:22:57

标签: c# wpf mvvm entity-framework-6

所以,我迷失了方向,希望得到一些指导。我使用的是MVVM模式和EF。

My View包含绑定到视图模型中可观察集合的数据网格。 UI还具有3个组合框,其中包含可能的数据以最小化所示数据。

所以我一直在谷歌上搜索,发现我无法使用(或者可能没有正确理解它)。

如何从ObservableCollection中搜索和选择项目,并相应地更新数据网格?

    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 个答案:

答案 0 :(得分: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,第一个包含你的所有项目,第二个是你绑定的过滤集合....

答案 1 :(得分:2)

我建议您使用包含ObservableCollection的CollectionViewSource。看看Hanselman关于它的教程

http://www.hanselman.com/blog/CollectionViewSourceIsCrazyUsefulForBindingToFilteredObservableCollectionsOnWindowsPhone8.aspx