DatagridComboBoxColumn.ItemsSource不反映来自数据网格的源绑定以外的源的更改

时间:2011-10-03 16:22:19

标签: wpf binding datagrid combobox itemssource

ComboBox项目不反映从其来源所做的更改

这是我想要完成的事情: 我有一个绑定到数据库表的WPF datagrid,在datagrid里面有一个combobox(组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.

2 个答案:

答案 0 :(得分:1)

这可能是因为您的GroupIdListList而不是ObservableCollection,或者因为您绑定了StaticResource,WPF假设该版本未更改,因此只加载一次。

将您的List<string>更改为ObservableCollection<string>,这会在收集更改时自动通知用户界面,如果仍然无效,请将ItemsSource从{{1}更改为StaticResource转到RelativeSource绑定,例如

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

修改

具有DataGrid的ItemsSource集合的父ViewModel应如下所示。只需为GroupIdList添加另一个公共属性,并让它返回您的列表。假设您的DataGrid的ItemsSource以RelativeSource

<DataGrid ItemsSource="{Binding MyDataGridItemsSource}" ... />

答案 1 :(得分:0)

WPF不会每次都进行轮询并检查您的列表是否已更改。为了做到这一点,正如雷切尔指出的那样你应该做的事情如下:

public class GroupIDList : ObseravableCollection<string>

编辑:

这是我的建议:

我实际上不会像你那样做。我所做的是为整个网格创建一个View Model,如下所示:  public class MyGridViewModel : DependencyObject

我将其用作网格的数据上下文:

DataContext = new MyGridViewModel ();

现在,MyGridViewModel的实现将包含一个表示我的GridRows的ViewModel列表,它是一个ObservableCollection

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

我会在我的dataGrid中这样做:

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

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

public class RowGridViewModel: DependencyObject
{

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

    }

如果有帮助,请告诉我