我正在使用一个利用MVVM的Silverlight 4.0项目,我们有一个驻留在视图上的组合框,其值和选定值分别绑定到可观察的组织集合和SelectedOrganization(视图模型上都存在这两个值) 。通过我们的项目,可以隐藏或显示此控件所在的页面。第一次加载一切看起来都很棒但是当你转到另一个控件(用控件隐藏选项卡然后再回到它)时,组合框中当前选中的值看起来像是空白,但是当我调试时,选中价值仍然存在。
可视化树正在重新创建,但我不知道为什么当父页面被隐藏然后重新显示时,组合框会丢失应该在框中的文本。页面上的所有其他控件都表现正常(autocompletetextbox,textblocks,textboxes,所有这些控件都以相同的方式绑定到viewmodel)。
以下是组合框的声明方式:
<ComboBox
SelectedItem="{Binding SelectedOrganization, Mode=TwoWay}"
ItemsSource="{Binding Organizations}"
DisplayMemberPath="Name"
Margin="5,0"
MinWidth="100" />
组织的班级在这里:
[DataContract]
public class Organization
{
[DataMember]
public Guid OrganizationID { get; set; }
[DataMember]
public string Name { get; set; }
}
并且viewmodel具有以下绑定代码:
public Organization SelectedOrganization
{
get { return (Organization)GetValue("SelectedOrganization"); }
set
{
SetValue("SelectedOrganization", value);
}
}
public ObservableCollection<Organization> Organizations
{
get { return (ObservableCollection<Organization>)GetValue("Organizations"); }
set { SetValue("Organizations", value); }
}
切换父页面时,如何保持所选值,我需要做什么?
答案 0 :(得分:1)
问题是我在SelectedItem之后声明了ItemsSource。显然这是Silverlight 3和4中的一个错误。答案在这里讨论Silverlight Combobox and SelectedItem。
答案 1 :(得分:0)
如果添加到上一篇文章可能会有所帮助,我注意到我的selectedItem
绑定属性必须包含一个条件,以避免分配null值,因为一旦控件被滚动或其他任何东西隐藏,组合框控件仍然想要重置值
即。 :
public string Month{
get {return _month;}
set {
if (value==null)
return;
_month = value;
}
}
答案 2 :(得分:0)
只是关于SL3错误的快速说明。
我没有在一个干净的环境中重现这个错误(因为我正在逐渐复制SL ComboBox bug ...),但是我遇到了大致这个设置的问题:
行为:当用户TAB从文本框进入组合框时,组合框值被“消隐”,而ViewModel保持其值。当用户TAB退出ComboBox时,该值会再次正确显示。请注意,如果仅单击组合框,或者从另一个组合框中选中组合框,则该值不会被消隐。
解决方案:当使用调试器逐步执行代码时,似乎在ItemsSource之前返回SelectedItem,即使ItemsSource在XAML代码中的SelectedItem之前声明。
解决方案是将ItemsSource从TwoWay BindingMode更改为OneWay BindingMode。
这可能会阻止某些事件在幕后被盗。
溴。的Morten
答案 3 :(得分:0)
使用此
<ScrollViewer Grid.Row="6" Grid.ColumnSpan="4" Height="190">
<sdk:DataGrid Name="datagridInvestigation"
AutoGenerateColumns="False" Width="650"
MinHeight="180" >
</sdk:DataGrid>
</ScrollViewer>
而不是
<sdk:DataGrid Name="datagridInvestigation"
AutoGenerateColumns="False" Width="650"
Height="180" ScrollViewer.HorizontalScrollBarVisibility="Auto" >