为什么实现ObservableCollection会使我的silverlight应用程序崩溃?

时间:2009-06-14 13:32:39

标签: silverlight crash observablecollection

我有一个组合框,其ItemsSource属性绑定到ObservableCollection属性,其SelectedIndex属性分别绑定到整数属性。

<ComboBox Name="cmbDealt" ItemsSource="{Binding Path=DealList, Mode=TwoWay}" SelectedIndex="{Binding Mode=TwoWay, Path=DealIndex}"></ComboBox>
<CheckBox IsChecked="{Binding Mode=TwoWay, Path=SomeCondition}" Content="Some Condition"></CheckBox>

我的数据结构类似于

 private ObservableCollection<string> m_DealList = null;
    private int m_DealIndex = 0;
    private bool m_SomeCondition = false;

    public ObservableCollection<string> DealList
    {
        get
        {
            if (m_DealList == null)
                m_DealList = new ObservableCollection<string>();
            else
                m_DealList.Clear();

            if (m_SomeCondition)
            {
                m_DealList.Add("ABC");
                m_DealList.Add("DEF");
            }
            else
            {
                m_DealList.Add("UVW");
                m_DealList.Add("XYZ");
            }
            return m_DealList;
        }
    }

    public int DealIndex
    {
        get { return m_DealIndex; }
        set
        {
            if (value != -1)
            {
                m_DealIndex = value;
            }
        }
    }

    public bool SomeCondition
    {
        get { return m_SomeCondition; }
        set
        {
            m_SomeCondition = value;
            OnPropertyChanged("DealList");
            OnPropertyChanged("DealIndex");
        }
    }

现在应用程序已成功加载。但是,当用户将ComboBox的SelectedIndex从0更改为1然后检查复选框(以便调用“DealIndex”属性更改事件)时,应用程序崩溃。

我不确定为什么会发生这种情况。有人可以提出一些建议并提出解决方案吗?

... TIA 萨迪普

2 个答案:

答案 0 :(得分:0)

一种选择是将selectedindex的绑定更改为selecteditem。你可以完成同样的事情。我最初是通过尝试更改selectedindex来开始的,但我从未成功过。我想它可能只读。

答案 1 :(得分:0)

你不需要开火

OnPropertyChanged("DealList");

因为属性是ObservableCollection。这意味着它实现了观察者模式,当添加和删除项目时,它将自行触发。

除非用户可以通过用户界面更新项目,否则不需要将ObservableCollection的绑定模式设置为TwoWay。您的代码似乎不允许这样做。

除非有多个CheckBox,否则你也可以在ComboBox上使用SelectedIndexChanged而不是在CheckBox上执行操作。这只是为了提供更好的用户体验。