WPF XAML 在 ListView 中看不到复选框

Posted

技术标签:

【中文标题】WPF XAML 在 ListView 中看不到复选框【英文标题】:WPF XAML can not see checkboxes in ListView 【发布时间】:2019-03-04 03:15:06 【问题描述】:

我正在开发一个小型 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>

但不幸的是,文本框下方没有显示任何内容...

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

谢谢大家 干杯

【问题讨论】:

【参考方案1】:

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

<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】:

您不能绑定到方法,只能绑定到 Properties 或 DependencyProperties。

所以您需要为您的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>

【讨论】:

以上是关于WPF XAML 在 ListView 中看不到复选框的主要内容,如果未能解决你的问题,请参考以下文章

如何为 ListView 控件中的第一个 WPF RadioButton 设置 XAML,以便默认检查?

列表框在 xaml 查看器中看起来与在程序窗口中不同

C# wpf listview 如何动态添加 高手回答下

在 WPF 中访问 DataGrid 的 ScrollView 属性

列表视图中的文本块不显示绑定数据 - WPF XAML

WPF MVVM ListView动态绑定数据