【发布时间】:2015-07-12 12:43:29
【问题描述】:
我有一个 MVVM 应用程序,我正在尝试通过 LinQ 对我的 ObservableCollection 进行过滤,该 ObservableCollection 是从基于实体框架的数据库中获取的。
在视图模型中我有这个:
public class MenuListViewModel : BaseViewModelCollection<Menu>
{
private string filterString;
public string FilterString
{
get { return filterString; }
set
{
if (Equals(value, filterString)) return;
filterString = value;
RaisePropertyChanged();
}
}
//TODO problems with notification, filter doesn't work
public ObservableCollection<Menu> FilteredItems
{
get
{
if (filterString == null) return Items; //Items is Observable Collection that contains every Item
var query = Items.Where(x => x.Time.ToString().StartsWith(filterString));
return new ObservableCollection<Menu>(query);
}
}
public MenuListViewModel(MenuService menuService)
{
base.Service = menuService; //Using IoC to get service
}
}
在 Xaml 中我有以下绑定:
<TextBox x:Name="RecipeFilterBox" Margin="5,5,0,0" TextWrapping="Wrap" Text="{Binding FilterString, NotifyOnTargetUpdated=True}" Grid.Column="1" Height="47.07" VerticalAlignment="Top"/>
问题是当我在 TextBox 中写任何东西时,什么都没有改变。我知道 propertyChanged 事件有问题,但我真的不知道如何解决这个问题。如果您需要有关此应用的更多信息,请询问我。
编辑: FilteredItems 的 xaml 如下所示:
<ListBox x:Name="MenuItemsListView" ItemsSource="{Binding FilteredItems}" SelectedItem="{Binding DeletedItem, Mode=OneWayToSource}" Foreground="#FFFFEDD3" FontFamily="Segoe Print" FontWeight="Bold" FontSize="18.667" Grid.ColumnSpan="3" Grid.Row="1" ItemContainerStyle="{DynamicResource ListBoxItemStyle1}" Style="{DynamicResource ListBoxStyle1}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Recipe.Name}" Width="255"/>
<TextBlock Width="175" Text="{Binding Time, Converter={StaticResource EnumTimeToItsDescriptionValueConverter}, Mode=OneWay}" />
<TextBlock Text="{Binding Date, StringFormat=dd.MM.yyyy}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
【问题讨论】:
-
你需要在构造函数中用'+='注册事件。
-
具体注册到什么地方?能具体点吗?
-
在以下网页查看答案 2:stackoverflow.com/questions/3042179/…
标签: c# wpf linq mvvm observablecollection