【发布时间】:2016-04-11 13:22:56
【问题描述】:
所以,我很迷茫,希望得到一些指导。我正在使用 MVVM 模式和 EF。
我的视图包含一个绑定到视图模型中可观察集合的数据网格。 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# 代码中充满了我尝试过的示例。
【问题讨论】:
-
请发布您的代码
-
您是否在询问如何根据视图模型的属性选择数据网格中的行? This may help(
Selector是DataGrid的基类,所以DataGrid具有SelectedItem属性,就像ComboBox等一样)。DataGrid.SelectionMode、DataGrid.SelectionUnit和DataGrid.SelectedCells也可能会有所帮助。 -
我建议你使用一个包含 ObservableCollection 的 CollectionViewSource。看看 Hanselman 的教程hanselman.com/blog/…
-
您在未通知 UI 的情况下为
TargetParameters分配了一个新值。您需要在TargetParameters的设置器中触发PropertyChanged事件。Convert方法到底有什么用途?TargetParameters.Single(k => k.ID == i);的目的是什么?那个电话什么也没做。TargetParameters.Where(x => x.FactTargets == SelectedLocation.FactTargets);也不做任何事情。你会在SelectedLocation的 setter 中解雇PropertyChanged吗?如果你没有PropertyChanged事件,你的viewmodel需要实现INotifyPropertyChanged。 -
看起来您尝试替换收藏。没有。在集合中找到一个项目很容易。获得项目后,您可以找到它的索引。然后,您可以删除该项目并将其替换为数据库中的更新项目。操作集合对象,不要替换整个集合。
标签: c# wpf mvvm entity-framework-6