2013-12-22 63 views
0

我有我想要迁移到使用的最佳实践,在这种情况下MVVM的UI。我遇到了一些我不确定如何以最佳方式处理的事情。结合动态创建WPF UI对象的MVVM模式

用户界面是命令与上面一些过滤的选项列表 - 订单来源和日期。来源是订单来自哪里,即。电话,易趣,亚马逊等,这些都在数据库中定义。

用于选择源的过滤器UI是一组功能区切换按钮,一个用于每个源 - 这样用户可以选择的源的任意组合和订单的列表将显示从所选来源只订单。这是从数据库建立起来,像这样:

<Custom:RibbonGroup Header="Sources" ItemsSource="{Binding Sources}"> 
    <Custom:RibbonGroup.ItemTemplate> 
     <DataTemplate DataType="{x:Type Data:OrderSource}"> 
      <Custom:RibbonToggleButton Label="{Binding Name}" /> 
     </DataTemplate> 
    </Custom:RibbonGroup.ItemTemplate> 
</Custom:RibbonGroup> 

(“源”是OrderSource对象的一个​​ObservableCollection,从数据库加载。)

我的“模式”的过滤器控制与对象各种过滤器选项性质,即:

public class OrdersFilter 
{ 
    public List<int> SourceIds { get; set; } 
    public DateTime FromDate { get; set; } 
    public DateTime ToDate { get; set; } 
} 

过滤器然后在到订单库GetOrders方法通过:

public IEnumerable<Order> GetOrders(OrdersFilter filter) 
{ 
    return this.context.Orders.Where(order => filter.SourceIds.Contains(order.SourceId) && order.Date >= filter.FromDate && order.Date < filter.ToDate); 
} 

其结果绑定到ViewModel上的订单列表上的ObservableCollection。

现在,这是它变得棘手。 ViewModel和日期的绑定非常简单 - 只是绑定到DatePickers的SelectedDateTime属性的几个DateTime属性。

我甚至不知道从哪里开始的模式在UI一堆动态生成的切换按钮绑定ID的列表,但!

我要对这个在完全错误的方式?还是有一个简单的解决方案呢?

+0

你想选择在UI IDS? – Tony

回答

0

最简单的方法是创建OrderSource,如OrderSourceViewModel一个新的视图模型对象,将含有“IsUserInterested”布尔属性。

之后,您将其绑定在ToggleButton上。

<Custom:RibbonToggleButton Label="{Binding Name}" IsChecked="{Binding IsUserInterested}" /> 

现在,您可能需要创建一个新的按钮,“应用”将被从数据库中获取必要的命令,像这样:

orders = GetOrders(new OrdersFilter{ 
             SourceIds = OrderSources 
             .Where(x => x.IsUserInterested) 
             .Select(x => x.Id)});