为什么我的ListView没有绑定到ItemSource?

3

我有一个非常简单的界面设计,里面包含一个ListView和一个按钮。 当点击按钮时,我想要填充Listview。

 <Grid>
        <Button Click="ButtonBase_OnClick" Content="Button" HorizontalAlignment="Left" Margin="349,259,0,0" VerticalAlignment="Top" Width="75"/>

        <ListView Margin="10,10,10,202" Name="lvUsers" ItemsSource="{Binding SomeData.Users}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                </GridView>
            </ListView.View>
        </ListView>

    </Grid>

我已将ListView的ItemSource属性绑定到SomeData.Users,它是一个ObservableCollection,当其更新、添加、删除或刷新时应通知UI。在下面的列中,我将DisplayMember绑定到可观察集合的Name属性。
这是SomeData类。
public class SomeData
    {
        public static ObservableCollection<User> Users { get; } = new ObservableCollection<User>();

        public static void Populate()
        {
            Users.Add(new User() { Name = "John Doe", Age = 42, Mail = "john@doe-family.com" });
            Users.Add(new User() { Name = "Jane Doe", Age = 39, Mail = "jane@doe-family.com" });
            Users.Add(new User() { Name = "Sammy Doe", Age = 7, Mail = "sammy.doe@gmail.com" });
        }
    }

    public class User
    {
        public string Name { get; set; }

        public int Age { get; set; }

        public string Mail { get; set; }
    }

以下是MainWindow.cs文件:

public MainWindow()
        {
            InitializeComponent();
        }

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            SomeData.Populate();
        }

据我所知,我不应该在任何地方设置DataContext.. 对吗?

1
你的绑定代码意味着:使用 DataContext.SomeData.Users 中的值。 - Sir Rufo
2个回答

5
问题在于您的绑定语法有误。您试图绑定到一个静态属性,尝试使用以下代码进行绑定:
"{Binding Source={x:Static YourNameSpace:SomeData.Users}}"

如果您使用的是WPF 4.5或更新版本:

"{Binding Path=(YourNameSpace:SomeData.Users)}"

一个提示:对于像你的问题这样的问题,始终尝试查看输出窗口并查找 System.Window.Data Error,这些通常是绑定异常,在绑定表达式无法解析时发生。在你的情况下,我确信你会发现这个异常。


哦..我以前从未绑定过静态属性,这解释了很多问题,而且它不会在输出窗口中显示,至少这次没有,但我相信有一天我会遇到它的。 - Mark Denom
另外,我尝试绑定命名空间,但它没有起作用,它告诉我要这样做:为什么是local:?x:Static local:SomeData.Users。 - Mark Denom
@MarkDenom,如果我表达不够清楚,很抱歉。我指的不是你类型(class)的命名空间,而是XAML命名空间。请查看此链接以获取更多信息 =) - taquion
@Clemens,感谢你的编辑=),忘了提到这一点。 - taquion

2

您需要为XAML设置数据上下文。

将数据上下文添加到MainWindow中。

public MainWindow()
{
       InitializeComponent();
       this.DataContext = new SomeData();
}

并将XAML的ItemsSource绑定更改为

ItemsSource="{Binding Users}"

1
这并不总是正确的... OP 绑定到一个静态属性,DataContext 不是必需的。 - taquion
是的,那样做是可行的,但不符合原帖作者的要求。 - Sir Rufo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接