C# 如何在WPF中将数据从DataContext传递到ListBox?
我有一个类定义如下:C# 如何在WPF中将数据从DataContext传递到ListBox?,c#,wpf,xaml,C#,Wpf,Xaml,我有一个类定义如下: public class Agent { public int Id { get; set; } public string Category { get; set; } // rest removed for brevity } 然后,在WPF中,我以List的形式获取数据,并将其传递给DataContext,如下所示: List<Agent> agents; // this includes my data this.Dat
public class Agent
{
public int Id { get; set; }
public string Category { get; set; }
// rest removed for brevity
}
然后,在WPF中,我以List
的形式获取数据,并将其传递给DataContext
,如下所示:
List<Agent> agents; // this includes my data
this.DataContext = agents;
但这似乎并不正确。有什么想法吗?我还建议您使用MVVM。但是如果你不想那么试试这个 XAML:
政务司司长:
public主窗口()
{
初始化组件();
列表代理=新列表
{
新代理人
{
Category=“Category”
}
};
DataContext=代理;
}
公共类代理
{
公共字符串类别
{
得到;
设置
}
}
我还建议您使用MVVM。但是如果你不想那么试试这个
XAML:
政务司司长:
public主窗口()
{
初始化组件();
列表代理=新列表
{
新代理人
{
Category=“Category”
}
};
DataContext=代理;
}
公共类代理
{
公共字符串类别
{
得到;
设置
}
}
通常,DataContext将是一个视图模型类,它将包含代理列表;然后可以将ItemsSource绑定到该列表。涉及listbox的许多示例中的任何一个都将非常直接。如果列表本身是DataContext,则不确定绑定应该是什么样子
然后,一旦ItemsSource设置为代理列表,如果要在列表中显示类别,更简单的方法是将DisplayMemberPath设置为“Category”
我建议研究MVVM并学习如何应用它,在我看来这是一个非常宝贵的概念。通常,DataContext将是一个视图模型类,它将包含代理列表;然后可以将ItemsSource绑定到该列表。涉及listbox的许多示例中的任何一个都将非常直接。如果列表本身是DataContext,则不确定绑定应该是什么样子 然后,一旦ItemsSource设置为代理列表,如果要在列表中显示类别,更简单的方法是将DisplayMemberPath设置为“Category”
我建议研究MVVM并学习如何应用它,在我看来,这是一个非常宝贵的概念。您尝试将列表框绑定到字符串属性 您可以尝试以下方法: 为exemle myUC的用户控件命名 将属性添加到用户控件:
public List<Agent> AgentList { get; set; };
并按如下方式绑定列表框:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
Grid.Column="1"
ItemSource="{Binding Path=AgentList, ElementName=myUC"} />
您尝试将列表框绑定到字符串属性 您可以尝试以下方法: 为exemle myUC的用户控件命名 将属性添加到用户控件:
public List<Agent> AgentList { get; set; };
并按如下方式绑定列表框:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
Grid.Column="1"
ItemSource="{Binding Path=AgentList, ElementName=myUC"} />
也许这会给你一个想法:
也许这会给你一个想法:
让我按照亚历克斯建议的正确方式来帮助你 创建一个列表并在ViewModel中填充它,如下所示 视图模型
public类MainWindowViewModel:INotifyPropertyChanged
{
公共主窗口视图模型()
{
代理=新的可观察集合();
LoadData();
}
私有void LoadData()
{
Add(新代理{Id=1,Category=“a”});
Add(新代理{Id=2,Category=“b”});
Add(新代理{Id=3,Category=“c”});
}
}
在XAML中,列出并使用如下数据模板:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
Grid.Column="1"
ItemSource="{Binding Path=Category"} />
<Window.Resources>
<DataTemplate x:Key="AItemTemplate">
<TextBlock Text="{Binding Category}"></TextBlock>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding agents}"
ItemTemplate="{StaticResource AItemTemplate}"></ListBox>
就这样 让我按照亚历克斯建议的正确方式来帮助你 创建一个列表并在ViewModel中填充它,如下所示 视图模型
public类MainWindowViewModel:INotifyPropertyChanged
{
公共主窗口视图模型()
{
代理=新的可观察集合();
LoadData();
}
私有void LoadData()
{
Add(新代理{Id=1,Category=“a”});
Add(新代理{Id=2,Category=“b”});
Add(新代理{Id=3,Category=“c”});
}
}
在XAML中,列出并使用如下数据模板:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
Grid.Column="1"
ItemSource="{Binding Path=Category"} />
<Window.Resources>
<DataTemplate x:Key="AItemTemplate">
<TextBlock Text="{Binding Category}"></TextBlock>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding agents}"
ItemTemplate="{StaticResource AItemTemplate}"></ListBox>
就这样 获得你想要的东西的最快方法是:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
DisplayMemberPath="Category"
Grid.Column="1"
ItemSource="{Binding Path=."} />
把这些东西都捆起来
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
DisplayMemberPath="Category"
Grid.Column="1"
ItemSource="{Binding Path=Agents"} />
获得所需的最快方法是:
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
DisplayMemberPath="Category"
Grid.Column="1"
ItemSource="{Binding Path=."} />
把这些东西都捆起来
<ListBox
Name="agentCategoryListBox"
Grid.Row="2"
DisplayMemberPath="Category"
Grid.Column="1"
ItemSource="{Binding Path=Agents"} />
你在使用什么orm?你在使用什么orm?我认为这是不必要的复杂,并且会偏离“正确”的方式,即MVVM,这对我今后的工作更有帮助。在我看来:)我认为这是不必要的复杂,并分散了对“正确”方式的注意力,即MVVM,这将对我的未来更有帮助。在我看来:)