所以,我迷失了方向,希望得到一些指导。我使用的是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#代码中充满了我尝试过的例子。
答案 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关于它的教程