C# 如果手动创建了多个TextBlock(您没有向我们显示),那么创建鸟类列表就没有意义了,因为这意味着您的视图可以准确地知道有多少只鸟类(在您的viewmodel中??)。因此,Doncot正确地说,您应该使用列表框,或任何其他允许您显示项目列表的控件 第二,如果你想使用 ListBox < /代码>(或类似的),你需要考虑你的鸟类列表。绑定始终与inotifyproperty更改、inotifycollection更改和依赖属性相关。创建一个类来保存您的列表似乎没有必要,除非您有其他我们不知道的特殊需求
Doncot离那很近,但我想再碰一下。使用C# 如果手动创建了多个TextBlock(您没有向我们显示),那么创建鸟类列表就没有意义了,因为这意味着您的视图可以准确地知道有多少只鸟类(在您的viewmodel中??)。因此,Doncot正确地说,您应该使用列表框,或任何其他允许您显示项目列表的控件 第二,如果你想使用 ListBox < /代码>(或类似的),你需要考虑你的鸟类列表。绑定始终与inotifyproperty更改、inotifycollection更改和依赖属性相关。创建一个类来保存您的列表似乎没有必要,除非您有其他我们不知道的特殊需求,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,Doncot离那很近,但我想再碰一下。使用列表可以很好地工作,只是您的列表框在以后修改列表时不知道它需要自我更新。这是因为当发生更改时,List不会通知绑定引擎 如果将此功能与INotifyPropertyChanged一起实现,则在重新实例化整个列表时(即Birds=new List();),将能够触发绑定。这通常也不是你想要的 如果将整个列表更改为可观察集合,则执行Bird.Add(new Bird())时将触发绑定。这是因为observetecollection是INotifyCollec
列表
可以很好地工作,只是您的列表框
在以后修改列表时不知道它需要自我更新。这是因为当发生更改时,List
不会通知绑定引擎
如果将此功能与INotifyPropertyChanged
一起实现,则在重新实例化整个列表时(即Birds=new List();
),将能够触发绑定。这通常也不是你想要的
如果将整个列表
更改为可观察集合
,则执行Bird.Add(new Bird())时将触发绑定代码>。这是因为observetecollection
是INotifyCollectionChanged
接口的实现,您也可以选择自己实现它。到目前为止,您的绑定相当可靠,只是它不知道该列表中的Bird
何时被修改
考虑这一点:
Birds.ElementAt(0).Common_Name = "New Bird Name!";
集合本身没有被修改,因为它仍然保留着同一Bird
实例的引用。因此,绑定引擎将不会意识到此更改。要解决这个问题,您的Bird
类还需要实现INotifyPropertyChanged
,这与vishakh369的回答类似。好的,有很多问题
首先,您有一个鸟类列表,但您只有一个TextBlock
来显示它。如果您手动创建了多个TextBlock
(您没有向我们显示),那么没有必要创建一个鸟类列表,因为这意味着您的视图可以准确地知道有多少只鸟类(在您的viewmodel中??)。因此,Doncot正确地说,您应该使用列表框
,或任何其他允许您显示项目列表的控件
第二,如果你想使用<代码> ListBox < /代码>(或类似的),你需要考虑你的鸟类列表。绑定始终与
inotifyproperty更改
、inotifycollection更改
和依赖属性
相关。创建一个类来保存您的列表似乎没有必要,除非您有其他我们不知道的特殊需求
Doncot离那很近,但我想再碰一下。使用列表
可以很好地工作,只是您的列表框
在以后修改列表时不知道它需要自我更新。这是因为当发生更改时,List
不会通知绑定引擎
如果将此功能与INotifyPropertyChanged
一起实现,则在重新实例化整个列表时(即Birds=new List();
),将能够触发绑定。这通常也不是你想要的
如果将整个列表
更改为可观察集合
,则执行Bird.Add(new Bird())时将触发绑定代码>。这是因为observetecollection
是INotifyCollectionChanged
接口的实现,您也可以选择自己实现它。到目前为止,您的绑定相当可靠,只是它不知道该列表中的Bird
何时被修改
考虑这一点:
Birds.ElementAt(0).Common_Name = "New Bird Name!";
集合本身没有被修改,因为它仍然保留着同一Bird
实例的引用。因此,绑定引擎将不会意识到此更改。要解决这个问题,您的Bird
类还需要实现INotifyPropertyChanged
,这与vishakh369的回答类似。非常感谢您的回答!非常感谢你的回答!实现您的代码是可行的,然而,我真的很困惑我的代码的一种形式是如何不起作用的。就像我说的,我花了10个小时。所以有一次我使用了一个带有ItemSource=“{binding birdList.\u Birds}”的数据网格。鸟类列表。_Birds是一个鸟类列表,但它不会显示!这将等同于您的代码,但由于某些原因它不是。我唯一能想到的可能是我的语法不正确。如何访问我的birdList.\u Birds list?是否将要显示的属性绑定到DataGrid?要绑定,我使用了:。在我的主窗口中,我创建了一个名为birdList的对象,并向其中添加了两个Bird对象(参见原始帖子)。DataContext设置为:this.DataContext=this。其中“this”是我的主窗口,其中包括创建的birdList对象。也许我错过了绑定步骤,或者因为绑定是一种方式,所以我用来绑定的步骤是无序的?或者我可能把语法搞错了?特别是这一行可能是错误的,因为我试图访问另一个对象中的对象列表:更新了我的答案。非常感谢你的答案!非常感谢你的回答!实现您的代码是可行的,然而,我真的很困惑我的代码的一种形式是如何不起作用的。就像我说的,我花了10个小时。所以有一次我使用了一个带有ItemSource=“{binding birdList.\u Birds}”的数据网格。鸟类名录
<Grid Grid.Column="2">
<ContentControl Content="birdList">
<ContentControl.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Height="50" Text="{Binding Bird.Common_Name,diag:PresentationTraceSources.TraceLevel=High}">
</TextBlock>
</StackPanel>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
</Grid>
<Grid Grid.Column="2">
<ContentControl Content="birdList">
<ContentControl.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Height="50" Text="{Binding Test>
</TextBlock>
</StackPanel>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
</Grid>
public class Birds
{
public string Test { get; set; }
//Binding source must be a property!!
public List<Bird> _Birds { get; set; } = new List<Bird>();
public List<Bird> Bird
{
get
{
return this._Birds;
}
}
}
Birds.ElementAt(0).Common_Name = "New Bird Name!";