C# 如果手动创建了多个TextBlock(您没有向我们显示),那么创建鸟类列表就没有意义了,因为这意味着您的视图可以准确地知道有多少只鸟类(在您的viewmodel中??)。因此,Doncot正确地说,您应该使用列表框,或任何其他允许您显示项目列表的控件 第二,如果你想使用 ListBox < /代码>(或类似的),你需要考虑你的鸟类列表。绑定始终与inotifyproperty更改、inotifycollection更改和依赖属性相关。创建一个类来保存您的列表似乎没有必要,除非您有其他我们不知道的特殊需求

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

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的回答类似。

好的,有很多问题

首先,您有一个鸟类列表,但您只有一个
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!";