我有我的silverlight应用程序,它将数据从视图模型中提取到数据网格中。 vm通过Mef暴露。我还有一个具有组合框的细节网格。 vm还包含用于填充组合框值的数据。首次加载时,一切正常,te组合框中的选定项目是正确的,我可以选择其他值。但是,如果我对主数据网格进行排序(允许sort = true),那么我会在组合框消失中找到所选值的绑定。组合框仍然填充了数据,但没有选择任何内容。
之前有没有人遇到过这个问题?我不确定如何解决这个问题。
谢谢
答案 0 :(得分:1)
Shaggy,我前几天注意到这一点,试图设置异步ComboBox加载。出于某种原因,ComboBox似乎只是放弃了绑定(但你已经知道了)。无论如何,我把这篇文章放在一起解决了其中的一些问题。如果有帮助,请告诉我。
http://blogs.msdn.com/kylemc/archive/2010/06/18/combobox-sample-for-ria-services.aspx
凯尔
答案 1 :(得分:0)
你是如何收集组合框的数据的?它是字符串列表还是特定对象列表?可能发生的是,排序是在其组合框或每行数据中创建另一组对象,并且所选项目不再与引用匹配。你能发一个代码示例吗?
答案 2 :(得分:0)
组合框的代码如下
<TextBlock>Status</TextBlock>
<ComboBox x:Name="CB_Status" ItemsSource="{Binding Status}" SelectedValuePath="StatusId" SelectedValue="{Binding CurrentCall.StatusId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource StatusTemplate}" />
<TextBlock>Priority</TextBlock>
<ComboBox x:Name="CB_Priority" ItemsSource="{Binding Priorities}" SelectedValuePath="PriorityId" SelectedValue="{Binding CurrentCall.PriorityId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource PriorityTemplate}"/>
<TextBlock>Issue Type</TextBlock>
<ComboBox x:Name="CB_IssueType" ItemsSource="{Binding IssueType}" SelectedValuePath="IssueTypeId" SelectedValue="{Binding CurrentCall.IssueTypeId, Mode=TwoWay,NotifyOnValidationError=True, ValidatesOnExceptions=True}" ItemTemplate="{StaticResource IssueTemplate}" />
从VM中提取数据,并在开始时使用异步调用调用数据,并按如下方式填充变量:
private IEnumerable<Priority> _priorities;
public IEnumerable<Priority> Priorities
{
get { return _priorities; }
set
{
if (value != _priorities)
{
_priorities = value;
this.RaisePropertyChanged("Priorities");
}
}
}
private IEnumerable<Status> _status;
public IEnumerable<Status> Status
{
get { return _status; }
set
{
if (value != _status)
{
_status = value;
this.RaisePropertyChanged("Status");
}
}
}
private IEnumerable<IssueType> _issueType;
public IEnumerable<IssueType> IssueType
{
get { return _issueType; }
set
{
if (value != _issueType)
{
_issueType = value;
this.RaisePropertyChanged("IssueType");
}
}
}
所以组合框是各种实体的IEnumerable集合。事情是在排序时,父表,组合框丢失其选定的值,但组合框的数据保持不变。通过fiddler,我可以看到没有任何后续调用来获取组合框的数据。
答案 3 :(得分:0)
我之前对SelectedValue的一个想法和问题是,当一个combox,datagrid等...经历状态变化之类的;失去焦点,重绘和其他一些他们会将SelectedValue更改为null。当您选择值时,可以设置VM上的SelectedValue(绑定属性)。但是,当Grid对其进行排序时,它还会告诉VM将SelectedValue设置为“null”。因此,在排序之后,组合框被设置为默认值。
您可以尝试的事情是,在其中一个SelectedValue属性'set'上设置一个断点,并在Debug.Assert期间查看该值的设置频率,如果该值为null。
答案 4 :(得分:0)
此处不确定您的设置,但如果您的数据网格是一个调用列表而且CurrentCall是所选项目,您是否可以使用元素绑定? E.g。
<ComboBox x:Name="CB_Status"
ItemsSource="{Binding Status}"
SelectedItem="{ Path=SelectedItem.Status, Mode=TwoWay, ElementName=YOUR_DATAGRID}"
ItemTemplate="{StaticResource StatusTemplate}" />
我假设网格的datacontext绑定到你的VM上的IEnumerable<Call>
(或其他东西),所以我会说排序会产生一个新的集合(就像你说的那样.Sort或order等)。
这是一个工作示例的快速剪切(在这种情况下使用列表框而不是数据网格)
<ComboBox
DisplayMemberPath="DisplayName"
SelectedItem="{Binding Path=SelectedItem.Individual.IndividualNameTitle,
Mode=TwoWay, ElementName=AccountList}"
ItemsSource="{Binding Path=IndividualNameTitles}">
</ComboBox>
希望它有所帮助。