INotifyPropertyChanged绑定MVVM

时间:2018-02-04 20:53:18

标签: c# wpf xaml mvvm

我正在尝试将我的CheckBoxList从Code Behind重写为WPF C#中的MVVM模式。问题是,现在我有一个问题是获得所有选中的复选框。我已经实现了INotifyPropertyChanged接口。项目正在构建正确,当我设置断点时,我可以注意到我的复选框总是收到假值,即使它们已被选中。我想我可能在数据绑定方面做错了。拜托,有人可以提供帮助吗?我是MVVM中的新手。

INotifyPropertyChanged Implementation

    public class ObservableObject : INotifyPropertyChanged
    {

        #region INotifyPropertyChanged

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string strPropertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(strPropertyName));
        }

        #endregion

    }
}

模型

 public class SharedModel : ObservableObject
    {

        public bool IsSelected { get; set; }

        public string Name { get; set; }

        public string Method { get; set; }
    }

视图模型

   class TestViewModel : ObservableObject
    {
                private bool _fIsSelected;

                public bool IsSelected
                {
                    get => _fIsSelected;
                    set
                    {
                        _fIsSelected = value;
                        OnPropertyChanged("IsSelected");
                    }
                }

        public ObservableCollection<SharedModel> List { get; set; } = new ObservableCollection<SharedModel>
        {
            new SharedModel
            {
                Name = "A1",
                Method = Test(),
            },
            new SharedModel
            {
                Name = "A2",
                Method = TestOne()
            }
};

        public string GetSelectedCheckboxes()
        {
             var command =
                    from item in List
                    where item.IsSelected
                    select item.Method;
          return string.Join("\r&", new NewList<string>(command).ToArray());
        }

XAML中的复选框列表

<StackPanel Margin="0,0,769,510">
            <ListBox Name="ListBox"
                     ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                     ItemsSource="{Binding List}"
                     SelectionMode="Multiple" Background="{x:Null}" Margin="0,133,590,470" Foreground="White" BorderBrush="{x:Null}">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal"
                                    MinWidth="170" MaxWidth="170"
                                    Margin="0,0, 0, 0" >
                            <CheckBox x:Name="TestCheckbox"
                                      Tag="{Binding Method}" IsChecked="{Binding IsSelected}" />
                            <ContentPresenter
                                Content="{Binding Name}"
                                Margin="5,0, 15, 0" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </StackPanel>

测试视图

public partial class TestView : UserControl
{

    public TestView()
    {
        InitializeComponent();
        DataContext = new TestViewModel();
    }

1 个答案:

答案 0 :(得分:1)

绑定集合时,您需要3种更改通知:

  • 通知是否在集合中添加或删除元素。这就是唯一的事情ObservableCollection<T>需要注意的事情
  • 更改公开集合的属性的通知。使用新实例重新生成整个集合通常是不必要的。这将是列表&#39;列表&#39;在你的代码中,但技术上taht不应该编译,因为列表是一个非常常见的类。
  • 更改您在该集合中持有的T类型的每个属性的通知。在您的情况下,这将是SharedModel。

你的缩进有点搞砸了,所以我在解析你发布的代码时遇到了一些问题。