【问题标题】:Displaying only selected items from ListBox in new List在新列表中仅显示列表框中的选定项目
【发布时间】:2017-02-14 01:34:17
【问题描述】:

我对 WPF 和发现 XAML 比较陌生。

我在 XAML 中有一个 ListBox Name="EmployeeTitles"(如下所示)。为了演示问题DataContext = employees,即ObservableCollection<Employee>

        <ListBox Name="EmployeeTitles"
            ItemsSource="{Binding}"
            SelectionMode="Extended">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <ToggleButton IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
                            <!--StackPanel will have more items-->
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Title}"/>
                            </StackPanel>                         
                        </ToggleButton>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

我的“代码隐藏”类 sn-p 如下所示:

private string _title;
public string Title
{
    get { return _title; }
    set
    {
        _title = value;
        OnPropertyChanged();
    }
}

private bool _isSelected;
public bool IsSelected
{
    get
    {
        return _isSelected;
    }
    set
    {
        _isSelected = value;
        OnPropertyChanged();
    }
}

我想在不同的控件中显示所选项目。例如,有一个仅显示选定项目的列表。我可以在 XAML 中以某种方式标记我只想显示带有IsChecked="True" 的项目吗?我知道我可以有另一个 ObservableCollection 只存储选定的项目并在属性IsSelected 更改时在“代码隐藏”中更新它,但这似乎是一种开销,我想应该有一种方法可以在 XAML 中做到这一点?

【问题讨论】:

    标签: c# wpf xaml binding listbox


    【解决方案1】:

    您可以将另一个列表框与原始列表框的选定项绑定。试试下面的代码。

    <Grid>
        <StackPanel Orientation="Horizontal">
            <ListBox x:Name="Emp" ItemsSource="{Binding EmpCollection}" SelectionMode="Extended">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <ToggleButton IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}">
                                <!--StackPanel will have more items-->
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Title}"/>
                                </StackPanel>
                            </ToggleButton>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <ListBox x:Name="SelectedEmp" ItemsSource="{Binding ElementName=Emp,Path=SelectedItems}" DisplayMemberPath="Title"/>
        </StackPanel>
    </Grid>
    
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }
    
    
    class ViewModel
    {
        public ObservableCollection<Emp> EmpCollection { get; set; }
    
        public ViewModel()
        {
            EmpCollection = new ObservableCollection<Emp>();
            for (int i = 0; i < 10; i++)
            {
                EmpCollection.Add(new Emp() {Title = "Title"+i});
            }
        }
    
    }
    
    class Emp:INotifyPropertyChanged
    {
        private string _title;
        public string Title
        {
            get { return _title; }
            set
            {
                _title = value;
                OnPropertyChanged();
            }
        }
    
        private bool _isSelected;
        public bool IsSelected
        {
            get
            {
                return _isSelected;
            }
            set
            {
                _isSelected = value;
                OnPropertyChanged();
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    
        }
    }
    

    【讨论】:

    • 你无法绑定ListBox.SelectedItems
    • 我的立场是正确的。这很酷。不过,您仍然必须以某种方式让它们回到视图模型。
    猜你喜欢
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多