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.
答案 0 :(得分:1)
这可能是因为您的GroupIdList
是List
而不是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;
}
}
如果有帮助,请告诉我