WPF XAML在ListView中看不到复选框

时间:2018-09-28 06:58:41

标签: c# wpf xaml listbox

我正在做一个小型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 个答案:

答案 0 :(得分: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以获得更多详细信息

问候!

答案 1 :(得分:0)

您不能绑定到方法,只能绑定到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>