C# ConcatSelectedElements() { SelectedItemsString=string.Join(“,”,CollectionOfItems.Where(x=>x.Checked).ToList().Select(x=>x.Name)).Trim(); } }

C# 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

mm8答案有效。与此同时,我想出了另一种方法。不是100%与MVVM兼容,但它可以工作并且非常简单

XAML

<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();
        }
    }