C# wpf observablecollection 绑定到 xaml

C# wpf observablecollection binding to xaml

我正在尝试使用 ObservableCollection 将数据从 object 绑定到 xaml 视图: 我有一个 class 其中有 属性 :

public ObservableCollection<Roll> RollList = new ObservableCollection<Roll>();

还有一些修改 collection 的方法(基本上是添加新条目的方法),例如:

RollList.Add(roll); //roll is and Roll class object bellow

这是我在 collection 中使用的卷 class:

class Roll : INotifyPropertyChanged
{
    private List<int> _hitList;

    public List<int> HitList
    {
        get { return _hitList; }
        set { _hitList = value; OnPropertyChanged("HitList"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
}

public class ListToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        List<int> list = value as List<int>;
        return String.Join("", list.ToArray());
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string list = value as string;
        return list.Split(' ').Select(n => int.Parse(n)).ToList();
    }
}

现在在我的主 window class 中实例化我的 class,它在上面构造 ObservableCollection object 并用数据填充它;

我像这样将 collection 绑定到 DataContex;

DataContext = MyCoolClass; //MyCoolClass has ObservableCollection<Roll> RollList inside of it

我做的最后一件事:

<Window.Resources>
    <local:ListToStringConverter x:Key="ListToStringConverter" />
</Window.Resources>

<ListBox 
    Height="Auto" 
    Width="Auto" 
    Name="RollList" 
    ItemsSource="{Binding RollList, Converter={StaticResource ListToStringConverter}}"
/>

列表框中没有填充数据。我知道 RollList object 充满了数据,因为我可以在 watch window 中找到它,如果我手动分配列表框项目源:

RollList.ItemsSource = ConvertedCollection;

有效,列表框填充了我不需要的数据,但我想将其绑定到 xaml;

PS。我是 C# 和 WPF 的新手。

public ObservableCollection<Roll> RollList = new ObservableCollection<Roll>();

那不是 属性。那是一个领域。 WPF 使用属性。

您需要实施 属性。

public MyCoolClass
{
    private ObservableCollection<Roll> _rollList;

    public ObservableCollection<Roll> RollList
    {
        get { return _rollList; }
        set
        {
            if (_rollList != value)
            {
                _rollList = value;
                OnPropertyChanged("RollList");
            }
        }
    }
}