代码之家  ›  专栏  ›  技术社区  ›  Roxy'Pro

WPF XAML在ListView中看不到复选框

  •  0
  • Roxy'Pro  · 技术社区  · 6 年前

    我在做一个小的WPF项目,

    目前,它包含一个窗口,该窗口应显示与列表中的许多值一样多的复选框。

    出于测试目的,在从数据库获取值之前,我尝试了以下方法:

    public class StatusOption
    {
       public string name { get; set; }
       public bool IsSelected { get; set; }
    }
    
    public void GetSerialNumbers()
    {
       List<StatusOption> serialNumbers = new List<StatusOption>();
    
       for(int i = 0; i<10;i++)
       {
           StatusOption x = new StatusOption();
           x.name = "Random name" + i;
           x.IsSelected = false;
           serialNumbers.Add(x);
        }
    
    }
    

    我的xaml看起来是这样的:

    <ListBox x:Name="SerialNumbersListBox"
             AllowDrop="True"
                     Grid.ColumnSpan="2"
                     Grid.Row="2"
             ItemsSource="{Binding GetSerialNumbers}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <CheckBox Content="{Binding serialNumbers}"
                          IsChecked="{Binding IsSelected}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    

    但不幸的是,文本框下面什么也没有显示。。。

    但现在一切都是空的,我不知道为什么。。

    谢谢你们 干杯

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nhan Phan    6 年前

    无法绑定方法。请改用属性。

    <ListBox HorizontalAlignment="Left" Height="171" Margin="334,96,0,0" VerticalAlignment="Top" Width="248" AllowDrop="True"  x:Name="SerialNumbersListBox"
                     ItemsSource="{Binding SerialNumbers}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <CheckBox Content="{Binding name}"
                                  IsChecked="{Binding IsSelected}"/>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
    
    
    public class SerialNumbersListBoxViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        public class StatusOption
        {
            public string name { get; set; }
            public bool IsSelected { get; set; }
        }
    
        private ObservableCollection<StatusOption> _SerialNumbers;
        public ObservableCollection<StatusOption> SerialNumbers
        {
            get
            {
                return _SerialNumbers;
            }
            set
            {
                if (value != _SerialNumbers)
                {
                    _SerialNumbers = value;
                    OnPropertyChanged(nameof(SerialNumbers));
                }
    
            }
    
        }
    
        public void GetSerialNumbers()
        {
            if (_SerialNumbers == null)
                _SerialNumbers = new ObservableCollection<StatusOption>();
    
            for (int i = 0; i < 10; i++)
            {
                StatusOption x = new StatusOption();
                x.name = "Random name" + i;
                x.IsSelected = false;
                _SerialNumbers.Add(x);
            }
    
        }
    
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    
        public SerialNumbersListBoxViewModel()
        {
            GetSerialNumbers();
    
            }
    }
    

    link 更多细节

    尊敬!

        2
  •  0
  •   Ackdari    6 年前

    所以你需要为你的 serialNumbers INotifyPropertyChanged ,这样 ListBox

    public List<object> SerialNumbers
    {
        get => this._serialNumbersProperty;
        set
        {
            if (!List<object>.Equals(value, this._serialNumbersProperty))
            {
                this._serialNumbersProperty = value;
                OnPropertyChanged(nameof(this.SerialNumbers));
            }
        }
    }
    
    <ListBox x:Name="SerialNumbersListBox"
         AllowDrop="True"
                 Grid.ColumnSpan="2"
                 Grid.Row="2"
         ItemsSource="{Binding SerialNumbers}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding name}"
                      IsChecked="{Binding IsSelected}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
    </ListBox>