C# ConcatSelectedElements() { SelectedItemsString=string.Join(“,”,CollectionOfItems.Where(x=>x.Checked).ToList().Select(x=>x.Name)).Trim(); } }
mm8答案有效。与此同时,我想出了另一种方法。不是100%与MVVM兼容,但它可以工作并且非常简单 XAMLC# ConcatSelectedElements() { SelectedItemsString=string.Join(“,”,CollectionOfItems.Where(x=>x.Checked).ToList().Select(x=>x.Name)).Trim(); } },c#,wpf,checkbox,mvvm,viewmodel,C#,Wpf,Checkbox,Mvvm,Viewmodel,mm8答案有效。与此同时,我想出了另一种方法。不是100%与MVVM兼容,但它可以工作并且非常简单 XAML <ListBox x:Name="ListItems" SelectionMode="Multiple" Height="75" Width="200" ItemsSource="{Binding CollectionOfItems}" > <ListBox.ItemTemplate> <DataTem
<ListBox x:Name="ListItems" SelectionMode="Multiple" Height="75" Width="200" ItemsSource="{Binding CollectionOfItems}" >
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}" IsChecked="{Binding Checked, Mode=TwoWay}" Unchecked="GetCheckedElements" Checked="GetCheckedElements" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Text="{Binding SelectedItemsString, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" Width="160" Height="25" Margin="0,140,0,0"/>
型号
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);
}
}
public class Items
{
public bool Checked { get; set; }
public string Name { get; set; }
}
ItemsViewModel(BaseViewModel仅实现INotifyPropertyChanged)
MainViewModel
public class MainViewModel : BaseViewModel
{
private string _selectedItemsString;
private ObservableCollection<Items> _selectedItems;
public ObservableCollection<Items> CollectionOfItems { get; set; }
public ObservableCollection<Items> SelectedItems
{
get => _selectedItems;
set
{
_selectedItems = value;
OnPropertyChanged("SelectedItems");
}
}
public string SelectedItemsString
{
get => _selectedItemsString;
set
{
if (value == _selectedItemsString) return;
_selectedItemsString = value;
OnPropertyChanged("SelectedItemsString");
}
}
public MainViewModel()
{
CollectionOfItems = new ObservableCollection<Items>();
SelectedItems = new ObservableCollection<Items>();
CollectionOfItems.Add(new Items { Checked = false, Name = "Item 1" });
CollectionOfItems.Add(new Items { Checked = false, Name = "Item 2" });
CollectionOfItems.Add(new Items { Checked = false, Name = "Item 3" });
}
public void FindCheckedItems()
{
CollectionOfItems.Where(x => x.Checked).ToList().ForEach(y => SelectedItems.Add(y));
}
public void ConcatSelectedElements()
{
SelectedItemsString = string.Join(", ", CollectionOfItems.Where(x => x.Checked).ToList().Select(x => x.Name)).Trim();
}
}
public类MainViewModel:BaseViewModel
{
私有字符串\u selectedItemsString;
私有可观测集合_selectedItems;
公共observeCollectionCollectionFitems{get;set;}
公共可观测集合SelectedItems
{
get=>\u selectedItems;
设置
{
_selectedItems=值;
OnPropertyChanged(“SelectedItems”);
}
}
公共字符串SelectedItemsString
{
get=>\u selectedItemsString;
设置
{
如果(值==_selectedItemsString)返回;
_选择编辑字符串=值;
OnPropertyChanged(“SelectedItemsString”);
}
}
公共主视图模型()
{
CollectionOfItems=新的ObservableCollection();
SelectedItems=新的ObservableCollection();
添加(新项{Checked=false,Name=“Item 1”});
添加(新项目{Checked=false,Name=“项目2”});
CollectionOfItems.Add(新项{Checked=false,Name=“Item 3”});
}
public void FindCheckedItems()
{
CollectionOfItems.Where(x=>x.Checked).ToList().ForEach(y=>SelectedItems.Add(y));
}
公共void ConcatSelectedElements()
{
SelectedItemsString=string.Join(“,”,CollectionOfItems.Where(x=>x.Checked).ToList().Select(x=>x.Name)).Trim();
}
}
“文本框应将所有选定元素显示为串联字符串”-最困难的部分是在必须重新评估绑定时通知文本框SelectedEssayTypes
可以是一个简单的getter-only属性,用于连接EssayTypes.Where(o=>o.Checked)
。如果在代码后面创建项目,则考虑将主窗口视图模型实例传递到内部(例如,作为构造函数参数),然后每个项目可以在 Cuth< <代码> SETER中增加通知。“文本框应该将所有选定的元素显示为级联字符串”。-最难的部分是在必须重新评估绑定时通知文本框
SelectedEssayTypes
可以是一个简单的getter-only属性,用于连接EssayTypes.Where(o=>o.Checked)
。如果在代码后面创建项目,则考虑将主窗口视图模型实例传递到内部(例如,作为构造函数参数),然后每个项目可以在 Cuth Stter中增加通知。但是属性如何知道某个项已被检查?使用代码隐藏,我将组合框绑定到一个事件,并对发送者进行强制转换以检索所有选中的值。但是没有任何代码,我不知道如何宣布某些东西已经改变。这将自动发生,因为双向绑定。这太快了!但是属性如何知道某个项已被检查?使用代码隐藏,我将组合框绑定到一个事件,并对发送者进行强制转换以检索所有选中的值。但是,如果没有任何代码,我不知道如何宣布某些内容已更改。由于双向绑定,这将自动发生。
public MainViewModel()
{
// Load Essay Types
EssayTypeRepository essayTypeRepository = new EssayTypeRepository();
var essayTypes = essayTypeRepository.GetEssayTypes();
var essayTypeViewModels = essayTypes.Select(m =>
{
var vm = EssayTypeViewModel()
{
Text = m.Text
};
vm.PropertyChanged += OnPropertyChanged;
return vm;
});
EssayTypes = new ObservableCollection<EssayTypeViewModel>(essayTypeViewModels);
}
private void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Checked")
OnPropertyChanged("SelectedItems");
}
public string SelectedItems => string.Join(",", EssayTypes.Where(x => x.Checked).ToArray());
<ListBox x:Name="ListItems" SelectionMode="Multiple" Height="75" Width="200" ItemsSource="{Binding CollectionOfItems}" >
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}" IsChecked="{Binding Checked, Mode=TwoWay}" Unchecked="GetCheckedElements" Checked="GetCheckedElements" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Text="{Binding SelectedItemsString, UpdateSourceTrigger=PropertyChanged}" Grid.Column="0" Width="160" Height="25" Margin="0,140,0,0"/>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new MainViewModel();
}
private void GetCheckedElements(object sender, RoutedEventArgs e)
{
(DataContext as MainViewModel)?.FindCheckedItems();
(DataContext as MainViewModel)?.ConcatSelectedElements();
}
}
public class Items
{
public bool Checked { get; set; }
public string Name { get; set; }
}
class ItemsViewModel : BaseViewModel
{
private bool _checked;
private string _name;
public bool Checked
{
get => _checked;
set
{
if (value == _checked) return;
_checked = value;
OnPropertyChanged("Checked");
}
}
public string Name
{
get => _name;
set
{
if (value == _name) return;
_name = value;
OnPropertyChanged("Name");
}
}
}
public class MainViewModel : BaseViewModel
{
private string _selectedItemsString;
private ObservableCollection<Items> _selectedItems;
public ObservableCollection<Items> CollectionOfItems { get; set; }
public ObservableCollection<Items> SelectedItems
{
get => _selectedItems;
set
{
_selectedItems = value;
OnPropertyChanged("SelectedItems");
}
}
public string SelectedItemsString
{
get => _selectedItemsString;
set
{
if (value == _selectedItemsString) return;
_selectedItemsString = value;
OnPropertyChanged("SelectedItemsString");
}
}
public MainViewModel()
{
CollectionOfItems = new ObservableCollection<Items>();
SelectedItems = new ObservableCollection<Items>();
CollectionOfItems.Add(new Items { Checked = false, Name = "Item 1" });
CollectionOfItems.Add(new Items { Checked = false, Name = "Item 2" });
CollectionOfItems.Add(new Items { Checked = false, Name = "Item 3" });
}
public void FindCheckedItems()
{
CollectionOfItems.Where(x => x.Checked).ToList().ForEach(y => SelectedItems.Add(y));
}
public void ConcatSelectedElements()
{
SelectedItemsString = string.Join(", ", CollectionOfItems.Where(x => x.Checked).ToList().Select(x => x.Name)).Trim();
}
}