2014-07-23 86 views
1

我的MVVM WPF应用程序的GridView动态创建列目前已结合到一个ViewModel财产,已在XAML中定义的列一个GridView:在WPF MVVM

<ListView Grid.Row="0" ItemsSource="{Binding GroupedOrders}"> 
    <ListView.View> 
      <GridView> 
       <GridViewColumn> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <CheckBox IsChecked="{Binding Item2, Mode=OneWay}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <GridViewColumn Header="Date" DisplayMemberBinding="{Binding Item1.Date, StringFormat={}{0:dd/MM/yyyy}}" /> 
       <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Item1.Name}" /> 
       <!-- lots more --> 
      </GridView> 
    </ListView.View> 
</ListView> 

GroupedOrders是一个元组的一个ObservableCollection两种不同的项目类型:一个“订单”对象和一个布尔值,用于控制是否对于此特定视图“已选择”。

然而,“选择”属性尚未建模很好。显而易见,每个订单需要多个“选定”属性,具体取决于订单中的日期数量,可以是1到5之间。

要在UI模型这个,我需要与创建顺序每个日期类似的复选框GridviewColumn动态构造来取代单个复选框GridViewColumn。因此,GroupedOrders变成了Tuple <Order, List<bool>>,并且列表中的每个布尔都需要一列。

在任何给定的情况下,该列表的大小将是网格中的所有订单相同。但是,如果用户将新数据加载到网格中,则列表的大小将会改变。

不过,我看不出如何在MVVM做到这一点。现有的解决方案似乎适用于代码隐藏的情况,即GridView可以作为对象抓取并即时操作。我见过的唯一的MVVM解决方案是使用一个Converter来动态构建整个GridView,这对于这种情况似乎是巨大的矫枉过正,在GridView中有很多列,但只有一小部分需要动态。

还有别的办法吗?

+0

背后,你能不能请进一步解释有关'多个 “选择” properties'?这是'Dictionary '种类,每行将有“多选的属性”相同的计数? –

+0

@YuliamChandra谢谢!它目前是Tuple ,但效果大致相同。它需要成为一个元组<订单,列表>,以便每个日期可以独立选择。对于给定的实例,每行都有相同的日期数量,但如果用户将一些新数据加载到数据网格中,它可能会更改。我编辑了这个问题来反映这一点。是否有意义? –

+1

嗯..如果'States'是一个Order中的一个集合,那么这个列就是一个绑定到State的'ListView'? State是一个包含Name(字符串)和Value(布尔)属性的类吗? –

回答

1

不知道这是你所期望的,但是这是我能想到的。

查看

<ListView ItemsSource="{Binding Orders}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="State"> 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ListView ItemsSource="{Binding States}"> 
          <ListView.ItemsPanel> 
           <ItemsPanelTemplate> 
            <StackPanel Orientation="Horizontal"></StackPanel> 
           </ItemsPanelTemplate> 
          </ListView.ItemsPanel> 
          <ListView.Resources> 
           <Style TargetType="GridViewColumnHeader"> 
            <Setter Property="Visibility" Value="Collapsed" /> 
           </Style> 
          </ListView.Resources> 
          <ListView.View> 
           <GridView> 
            <GridViewColumn> 
             <GridViewColumn.CellTemplate> 
              <DataTemplate> 
               <CheckBox IsChecked="{Binding Value}" Content="{Binding Text}" /> 
              </DataTemplate> 
             </GridViewColumn.CellTemplate> 
            </GridViewColumn> 
           </GridView> 
          </ListView.View> 
         </ListView> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
      </GridViewColumn> 
      <GridViewColumn Header="OrderNo" DisplayMemberBinding="{Binding OrderNo}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

代码

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     Orders.Add(new Order { OrderNo = "Order001" }); 
     Orders.Add(new Order { OrderNo = "Order002" }); 
     Orders.Add(new Order { OrderNo = "Order003" }); 
    } 
    private readonly ObservableCollection<Order> _orders = new ObservableCollection<Order>(); 
    public ObservableCollection<Order> Orders 
    { 
     get { return _orders; } 
    } 
} 
public class Order 
{ 
    public Order() 
    { 
     States.Add(new State { Text = "Is Paid", Value = false }); 
     States.Add(new State { Text = "Is Delivered", Value = false }); 
    } 
    public string OrderNo { get; set; } 
    private readonly ObservableCollection<State> _states = new ObservableCollection<State>(); 
    public ObservableCollection<State> States 
    { 
     get { return _states; } 
    } 
} 
public class State 
{ 
    public string Text { get; set; } 
    public bool Value { get; set; } 
} 

结果

Result