2011-10-03 48 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