代码之家  ›  专栏  ›  技术社区  ›  Kye

如何将silverlight datagrid组合框itemSource绑定到viewModel

  •  3
  • Kye  · 技术社区  · 14 年前

    我正试图将组合框的itemsSource绑定到viewModel,但这似乎不可能,因为组合框已经绑定到自己行的dataItem。填充组合的逻辑在屏幕上用其他数据更改,因此我不能像以前那样真正使用静态列表。

    有没有办法将目录绑定到viewModel???我尝试过元素到元素的绑定,但这在网格中似乎不起作用。

           <Controls:DataGridTemplateColumn x:Name="FooNameCol" Header="Foo" MinWidth="200">
                <Controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
    
                        <StackPanel>
                            <TextBlock Text="{Binding Path=Foo.ShortName}" 
                                       Style="{StaticResource DataGridTextColumnStyle}"/>
                        </StackPanel>
    
                    </DataTemplate>
                </Controls:DataGridTemplateColumn.CellTemplate>
                <Controls:DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
    
                        <ComboBox DisplayMemberPath="ShortName"   
                                  MinWidth="200" MinHeight="25"
                                  SelectedItem="{Binding Path=Officer, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
                                  ItemsSource="{Binding Officers, Source={StaticResource ReferenceListRetriever}}" />
    
                    </DataTemplate>
                </Controls:DataGridTemplateColumn.CellEditingTemplate>
            </Controls:DataGridTemplateColumn>
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Marco Amendola    14 年前

    在一个DataTemplate中,DataContext被绑定到对应列表的每一项;因为所有绑定都隐式引用DataContext,所以必须确保路径有效, 从单个数据项开始 .

    public class MyVM {
       public IEnumerable<MyItem> Items {get;}
    }
    
    public class MyItem {
      public Foo Foo {get;}
      public Officer Officer {get;set;}
      public IEnumerable<Officer> Officers {get;}
    }
    

    这看起来有点过头了,但在某些情况下,每个组合实际上可以根据某些业务规则为每个数据项包含不同的选择。 在更简单的情况下,MyItem可以公开来自父MyVM的公共列表:

    public class MyItem {
      ...
      public IEnumerable<Officer> Officers {
        get { return _parent.AvailableOfficers; }
      }
    }
    

    public class MyVM {
      public IEnumerable<MyItem> Items {get;}
      public IEnumerable<Officer> Officers {get;}
    }
    
    public class MyItem {
      public Foo Foo {get;}
      public Officer Officer {get;set;}
    }
    

    Xaml:

    <UserControl ...>
      ...
      <AnyFrameworkElementAtThisLevel Name="bridge" />
      ...
      <Controls:WhateverGrid>
         ...
         <Controls:DataGridTemplateColumn ...>
            <Controls:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  ...
                </DataTemplate>
            </Controls:DataGridTemplateColumn.CellTemplate>
            <Controls:DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                    <ComboBox DisplayMemberPath="ShortName"   
                              SelectedItem="{Binding Path=Officer, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
                              ItemsSource="{Binding DataContext.Officers, ElementName=bridge}" />
    
                </DataTemplate>