我正在尝试将我的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();
}
答案 0 :(得分:1)
绑定集合时,您需要3种更改通知:
ObservableCollection<T>
需要注意的事情你的缩进有点搞砸了,所以我在解析你发布的代码时遇到了一些问题。