【问题标题】:RaisePropertyChanged doesn't work for ObservableCollectionRaisePropertyChanged 不适用于 ObservableCollection
【发布时间】:2013-05-26 11:50:12
【问题描述】:

我在使用 MVVM Light Toolkit 更新 UI 时遇到了一个非常奇怪的问题。 RaisePropertyChanged 对我的 ObservableCollection 根本不起作用。

这是 XAML 代码:

<ListBox x:Name="list"  ItemsSource="{Binding ModelList}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
       <ListBox.ItemTemplate>
           <DataTemplate>
               <StackPanel Orientation="Horizontal">
                   <TextBlock Text="{Binding Name}"></TextBlock>
                   <CheckBox IsChecked="{Binding IsChecked}"></CheckBox>
               </StackPanel>
           </DataTemplate>
       </ListBox.ItemTemplate>
       <interaction:Interaction.Triggers>
           <interaction:EventTrigger EventName="SelectionChanged">
                <cmd:EventToCommand Command="{Binding TempCommand}" CommandParameter="{Binding ElementName=list, Path=SelectedItem}"
                               PassEventArgsToCommand="True"/>
            </interaction:EventTrigger>
       </interaction:Interaction.Triggers>
   </ListBox>

还有ViewModel代码部分:

private Model _selectedItem;
    public Model SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            RaisePropertyChanged("SelectedItem");
        }
    }

    private ObservableCollection<Model> _modelList;
    public ObservableCollection<Model> ModelList
    {
        get { return _modelList; }
        set
        {
            _modelList = value;
            RaisePropertyChanged("ModelList");
        }
    }

    public RelayCommand<Model> TempCommand { get; private set; }
    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        modelList = new ObservableCollection<Model>()
            {
                new Model()
                    {
                        IsChecked = true,
                        Name = "Temp1"
                    },
                new Model()
                    {
                        IsChecked = false,
                        Name = "Temp2"
                    },
                new Model()
                    {
                        IsChecked = false,
                        Name = "Temp3"
                    }
            };
        ModelList = modelList;

        TempCommand = new RelayCommand<Model>(Model_SelectedItem);
    }

    private void Model_SelectedItem(Model item)
    {
        // What should I do here?
    }

当我更改 ModelList - ListBox UI 没有反应。

谁能帮帮我?

【问题讨论】:

  • 问题已解决。模型类必须从 ObservableObject 派生,其属性必须触发 RaisePropertyChanged 事件。
  • 如果你让它工作,然后尝试删除 ObservableCollection 上的 RaiseProperty - 它不需要它......
  • 是的,我当然做到了!

标签: mvvm listbox mvvm-light observablecollection


【解决方案1】:

问题解决了。

当您在 ObservableCollection 或 List 中有自定义类时,它必须从 ObservableObject 派生,并且所有属性都必须触发 RaisePropertyChanged 事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 2014-08-04
    相关资源
    最近更新 更多