【发布时间】:2019-06-03 00:25:26
【问题描述】:
我刚刚习惯了 MVVM,想摆脱代码隐藏并在视图模型中定义所有内容。 组合框代表几个选择选项(作品)。我想查询已检查的元素。 不幸的是,我无法访问它们。文本框应将所有选定元素显示为串联字符串。
视图模型
class MainViewModel : BaseViewModel
{
#region Fields
private ObservableCollection<EssayTypeViewModel> _essayTypes;
private EssayTypeViewModel _selectedEssayTypes;
#endregion
public ObservableCollection<EssayTypeViewModel> EssayTypes
{
get => _essayTypes;
set
{
if (_essayTypes == value) return;
_essayTypes = value; OnPropertyChanged("EssayTypes");
}
}
public EssayTypeViewModel SelectedEssayTypes
{
get => _selectedEssayTypes;
set { _selectedEssayTypes = value; OnPropertyChanged("SelectedEssayTypes"); }
}
public MainViewModel()
{
// Load Essay Types
EssayTypeRepository essayTypeRepository = new EssayTypeRepository();
var essayTypes = essayTypeRepository.GetEssayTypes();
var essayTypeViewModels = essayTypes.Select(m => new EssayTypeViewModel()
{
Text = m.Text
});
EssayTypes = new ObservableCollection<EssayTypeViewModel>(essayTypeViewModels);
}
}
XAML
<ListBox x:Name="Listitems" SelectionMode="Multiple" Height="75" Width="200" ItemsSource="{Binding EssayTypes}" >
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Text}" IsChecked="{Binding Checked}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Text="{Binding Path=SelectedEssayTypes}" Grid.Column="0" Width="160" Height="25" Margin="0,140,0,0"/>
【问题讨论】:
-
“文本框应该将所有选定的元素显示为连接字符串” - 最难的部分是在必须重新评估绑定时通知
TextBox。SelectedEssayTypes可以是一个简单的 getter-only 属性,它加入EssayTypes.Where(o => o.Checked)。如果您在后面的代码中创建项目,然后考虑在内部传递主窗口视图模型实例(例如作为构造函数参数),那么每个项目都可以在Checkedsetter 中发出通知。
标签: c# wpf checkbox mvvm viewmodel