C# 绑定列表的元素<;字符串>;到文本块

C# 绑定列表的元素<;字符串>;到文本块,c#,wpf,data-binding,C#,Wpf,Data Binding,我在试着让轮子旋转。我有5个定制的文本块,文本文件和值列表(可能由1-1000个项目组成)。读取文件后,我有一个“列表fileValues”及其值。我决定创建另一个“列表轮”,它将包含多达5个元素,并被绑定到文本块 按下旋转按钮时,“轮子”的最后一个元素将被删除,“值”中的新元素将添加到“轮子”列表的开头 为了使UI能够响应列表中的更改,最好将“控制盘”中的每个元素绑定到UI上相应的文本块。但到目前为止,我试图做的都没有成功 下面是我试图做的(代码有点脏,但我首先尝试让它工作) 5个自定义文本块

我在试着让轮子旋转。我有5个定制的文本块,文本文件和值列表(可能由1-1000个项目组成)。读取文件后,我有一个“列表fileValues”及其值。我决定创建另一个“列表轮”,它将包含多达5个元素,并被绑定到文本块

按下旋转按钮时,“轮子”的最后一个元素将被删除,“值”中的新元素将添加到“轮子”列表的开头

为了使UI能够响应列表中的更改,最好将“控制盘”中的每个元素绑定到UI上相应的文本块。但到目前为止,我试图做的都没有成功

下面是我试图做的(代码有点脏,但我首先尝试让它工作)

5个自定义文本块

<TextBlock Name="Value1" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value2" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value3" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value4" TextWrapping="WrapWithOverflow"/>
<TextBlock Name="Value5" TextWrapping="WrapWithOverflow"/>

实现INotifyCollectionChanged接口的ObservableList

class ObservableList : INotifyCollectionChanged, IEnumerable
{
    private readonly List<string> _valuesList;

    public string First
    {
        get { return _valuesList.First(); }
    }

    public string Last
    {
        get { return _valuesList.Last(); }
    }

    public ObservableList()
    {
        this._valuesList = new List<string>();
    }

    public string this[Int32 index]
    {
        get
        {
            if (_valuesList.Count == 0 || index + 1 > _valuesList.Count)
            {
                return "------";
            }
            return _valuesList[index];
        }
    }

    public void AddLast(string value)
    {
        _valuesList.Add(value);
        OnNotifyCollectionChanged();
    }

    public void AddFirst(string value)
    {
        _valuesList.Insert(0, value);
        OnNotifyCollectionChanged();
    }

    public void RemoveFirst()
    {
        _valuesList.RemoveAt(0);
        OnNotifyCollectionChanged();
    }

    public void RemoveLast()
    {
        _valuesList.Remove(_valuesList.Last());
        OnNotifyCollectionChanged();
    }

    public event NotifyCollectionChangedEventHandler CollectionChanged;
    public void OnNotifyCollectionChanged()
    {
        if (CollectionChanged != null)
        {
            CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    }

    public IEnumerator GetEnumerator()
    {
        return (_valuesList as IEnumerable).GetEnumerator();
    }
}
class ObservableList:INotifyCollectionChanged,IEnumerable
{
私有只读列表_valuesList;
公共字符串优先
{
获取{return _valuesList.First();}
}
最后一个公共字符串
{
获取{return _valuesList.Last();}
}
公众观察者()
{
这是._valuesList=new List();
}
此[Int32索引]的公共字符串
{
得到
{
如果(_valuesList.Count==0 | | index+1>_valuesList.Count)
{
返回“-----”;
}
返回值列表[索引];
}
}
公共void AddLast(字符串值)
{
_价值列表。增加(价值);
OnNotifyCollectionChanged();
}
公共void AddFirst(字符串值)
{
_值列表。插入(0,值);
OnNotifyCollectionChanged();
}
公共无效删除优先()
{
_值列表移除(0);
OnNotifyCollectionChanged();
}
公共void RemoveLast()
{
_valuesList.Remove(_valuesList.Last());
OnNotifyCollectionChanged();
}
公共事件通知CollectionChangedEventHandler CollectionChanged;
公共无效OnNotifyCollectionChanged()
{
如果(CollectionChanged!=null)
{
CollectionChanged(这是新的NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
公共IEnumerator GetEnumerator()
{
return(_valueslistas IEnumerable).GetEnumerator();
}
}
XAML代码隐藏

public partial class MainWindow : Window
{
    private List<string> _values = new List<string>();
    private ObservableList _uiValues = new ObservableList();

    public MainWindow()
    {
        InitializeComponent();

        Value1.DataContext = _uiValues[0];
        Value2.DataContext = _uiValues[1];
        Value3.DataContext = _uiValues[2];
        Value4.DataContext = _uiValues[3];
        Value5.DataContext = _uiValues[4];

    }

    private void LoadFileBtn_Click(object sender, RoutedEventArgs e)
    {
        //Loads text file and fills _values
    }

    private void SpinBtn_Click(object sender, RoutedEventArgs e)
    {
        InitUiTextBlocks();

        //Spin simulation
    }

    private void InitUiTextBlocks()
    {
        _uiValues.Clear();
        for (int i = 0; i < 5; ++i)
        { 
            //Nothing appears on UI and CollectionChanged event is null
            _uiValues.AddLast(_values.First());
            _values.RemoveAt(0);
        }
    }
}
公共部分类主窗口:窗口
{
私有列表_值=新列表();
私有可观察列表_uiValues=新的可观察列表();
公共主窗口()
{
初始化组件();
Value1.DataContext=_uiValues[0];
Value2.DataContext=_uiValues[1];
Value3.DataContext=_uiValues[2];
Value4.DataContext=_uiValues[3];
Value5.DataContext=_uiValues[4];
}
私有void LoadFileBtn\u单击(对象发送者,路由目标e)
{
//加载文本文件并填充_值
}
私有void SpinBtn_单击(对象发送方,路由目标)
{
InitUiTextBlocks();
//自旋模拟
}
私有void InitUiTextBlocks()
{
_uiValues.Clear();
对于(int i=0;i<5;++i)
{ 
//UI上不显示任何内容,CollectionChanged事件为空
_uiValues.AddLast(_values.First());
_值。RemoveAt(0);
}
}
}

我尝试使用“ObservableCollection”,但效果是一样的。UI上没有显示任何内容。事实上,我无法想象如何将每个列表元素绑定到特定的标签。甚至可以进行这样的绑定吗?

在XAML中,执行以下操作:

<Label Name="some_name" Content="{Binding SomeStingProperty}"/>
您也可以绑定到一个集合,如果它是一个
可观察集合
,它将在更改时更新

搜索基本XAML绑定,否则:)

(顺便说一句,它更干净,我认为它是XAML,我个人不喜欢在代码背后这样做…)

作为旁注,完全自我宣传,以下两篇文章可能会有所帮助:


  • 如果你是一个初学者,第二个可能有点让你不知所措,但是应该值得一读

    为什么不在xaml中绑定到属性p1…p5,并在需要它们的位置/时间设置它们?@Noctis-Hm,事实上我对WPF中的数据绑定还是新手。目前对我来说,最容易理解的数据绑定方式是代码隐藏。请您推荐一些源代码,或者用两个词来描述如何在xaml中实现它?如果我理解正确,我需要创建5个属性,从列表中获取不同的元素并捕获异常(如果有)。绑定将在XAML中完成?是的,您可以这样做,或者如果您想显示5合一控件(标签/文本框等),您可以绑定到可观察的集合属性,只需使用五项更新集合。
    public string SomeStringProperty {get; set;}