Silverlight Combobox会丢失视觉值,但会在隐藏和重新显示其所在页面时保持选定的值

时间:2010-08-27 16:05:21

标签: c# silverlight-4.0

我正在使用一个利用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); }
} 

切换父页面时,如何保持所选值,我需要做什么?

4 个答案:

答案 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 ...),但是我遇到了大致这个设置的问题:

  • ItemsSource绑定到对象X上的List类型的属性。
  • SelectedItem绑定到对象X上String类型的属性。
  • Object X实现了INotifyPropertyChanged。
  • 在上面的帖子指示的XAML代码中的ItemsSource之后设置SelectedItem。
  • ItemsSource设置为TwoWay BindingMode。

行为:当用户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" >