2011-10-03 22 views
2

组合框的项目并不反映其源所做的更改源的其他变化DatagridComboBoxColumn.ItemsSource没有反映从源头比开往数据网格

这里就是我试图完成: 我有一个WPF数据网格绑定到数据库表,在datagrid内部有一个组合框(组ID)列绑定到数据库表中的一列;组合框项目来自另一个表格(组ID列表)。现在的问题是当组别ID列表从其他表更改时,组合框项不起作用。 任何人都可以帮忙吗?已经研究了很长时间。

这里是XAML代码:

<DataGridTemplateColumn Header="Group ID"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding GroupID, Mode=OneWay}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <ComboBox Name="ComboBoxTeamGrpID" SelectedItem="{Binding GroupID, Mode=TwoWay}" ItemsSource="{StaticResource ResourceKey=GroupIDList}"> 
      </ComboBox> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

这里是GroupIDList代码:

public class GroupIDList : List<string> 
     { 
      public GroupIDList() 
     { 
      try 
      { 

       string tmp = ConfigurationManager.AppSettings["DataSvcAddress"]; 
       Uri svcUri = new Uri(tmp); 
       JP790DBEntities context = new JP790DBEntities(svcUri); 

       var deviceQry = from o in context.Devices 
           where o.GroupID == true 
           select o; 
       DataServiceCollection<Device> cList = new DataServiceCollection<Device>(deviceQry); 

       for (int i = 0; i < cList.Count; i++) 
       { 
        this.Add(cList[i].ExtensionID.Trim()); 
       } 

       this.Add("None"); 

       //this.Add("1002"); 
       //this.Add("1111"); 
       //this.Add("2233"); 
       //this.Add("5544"); 
      } 
      catch (Exception ex) 
      { 
       string str = ex.Message; 
      } 
     } 
    } 

Here is another problem related, can anyone help? thank you.

回答

1

这可能是因为你的GroupIdListList,而不是一个ObservableCollection,或者因为你绑定了一个StaticResource,WPF假定它没有改变,所以只加载一次。

更改List<string>ObservableCollection<string>,它会自动通知用户界面时,它的收藏得到改变,如果仍然无法比工作改变你的ItemsSourceStaticResourceRelativeSource结合,如

ItemsSource="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
    Path=DataContext.GroupIdList}" 

编辑

你的父母ViewModel其中有你的DataGrid的ItemsSource时收集应类似于下面。只需添加GroupIdList的另一个公共属性,并让它返回您的列表。然后使用上述RelativeSource结合来访问它,假设你的DataGrid的ItemsSource时在<DataGrid ItemsSource="{Binding MyDataGridItemsSource}" ... />

public class MyViewModel 
{ 
    private ObservableCollection<MyDataObject> _myDataGridItemsSource; 
    public ObservableCollection<MyDataObject> MyDataGridItemsSource 
    { 
     get { return _myDataGridItemsSource; } 
     set 
     { 
      if (value != _myDataGridItemsSource) 
      { 
       _myObjects = value; 
       ReportPropertyChanged("MyDataGridItemsSource"); 
      } 
     } 
    } 

    private ObservableCollection<string> _groupIdList = new GroupIdList(); 
    public ObservableCollection<string> GroupIdList 
    { 

     get { return _groupIdList; } 
    } 
} 
+0

改为的ObservableCollection和的RelativeSource约束力,仍然没有运气,任何其他建议吗? 'ItemsSource =“{Binding RelativeSource = {RelativeSource AncestorType = {x:Type DatagridTemplateColumn}},Path = GroupIdList}”'GroupIDList在Windows.Resources'下 ... '谢谢。 – Jeremy

+0

您的'RelativeSource'绑定不正确。你指向'DataGridTemplateColumn.GroupIdList',它不存在。在任何ViewModel包含DataGrid的数据上创建一个属性,让它返回你的'ObservableCollection GroupIdList',然后让你的'RelativeSource'指向'DataGrid',其路径为'DataContext.MyGroupIdListProperty',这样就可以得到它的数据的完整路径是'DataGrid.DataContext.MyGroupIdListProperty' – Rachel

+0

我正在使用实体数据模型通过wcf数据服务来绑定数据,如果创建一个与数据匹配的新类是要走的路,那么它如何绑定到数据呢?对不起,如果问题很简单,我是新来的wpf。再次感谢你。 – Jeremy

0

WPF的形​​式结合不会轮询每次和检查,如果您的列表改变。为了做到这一点,因为瑞秋指着你应该这样做:

public class GroupIDList : ObseravableCollection<string>

编辑:

这里是我的建议:

我其实不会做它,你的方式没有。我做的是我创建为整个网格视图模型,看起来像: public class MyGridViewModel : DependencyObject

这也是我作为数据上下文使用我网:

DataContext = new MyGridViewModel(); 

现在MyGridViewModel的实现将包含一个视图模型代表我的GridRows,这是一个ObservableCollection名单

public ObservableCollection<RowGridViewModel> RowItemCollection { get; private set; } 

我将在我的数据网格这样:

<Grid> 
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding RowItemCollection}" SelectionMode="Extended" SelectionUnit="Cell"> 
     <DataGrid.Columns> 

和你所需要做的就是用你正确的数据填写你的RowItemColleciton,然后将你的列绑定到RowGridViewModel中正确的属性......在你的情况下它看起来像(但你必须初始化GroupIDList:

public class RowGridViewModel: DependencyObject 
{ 

    public List<String> GroudIDList { get; set; 
     } 

    } 

让我,如果能够帮助

+0

请参阅Rachel的回复评论。任何建议?谢谢。 – Jeremy

+0

@Jeremy检查我的编辑,让我知道你是否需要更多的细节。 – MBen