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