我有以下 xaml -
<Window x:Class="DataTemplateTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="400" Width="600" Loaded="Window_Loaded">
<Grid>
<ListBox Height="380" Margin="10,12,0,0" Width="355"/>
</Grid>
</Window>
和下面的代码隐藏 -
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_nameList = new List<string>
{
"X",
"Y",
"Z"
};
}
private List<string> _nameList;
public List<string> NameList
{
get { return _nameList; }
}
}
我想将 NameList
设置为来自 xaml 的 ListBox 的 ItemsSource
,不是 来自代码隐藏。我怎么做?
编辑: 我知道这样做的 MVVM 方式。但这不是我要问的。
编辑: 这并不是说我不喜欢 MVVM 左右。在做一些快速测试时,我才意识到我不知道该怎么做。所以,想知道这是否可能,并尝试学习。无论如何都可以使用 StaticResource
吗?
最佳答案
如果您的意思是“不采用 MVVM 方式”您不想使用 ViewModel,那么您 可以通过以下步骤将数据绑定(bind)到“代码隐藏”:
在 XAML 中设置绑定(bind):
<ListBox ItemSource="{Binding NameList}"/>
并在填充列表后将 DataContext
设置为 this
,例如在 Window_Loaded
事件中:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
_nameList = new List<string>
{
"X",
"Y",
"Z"
};
DataContext = this;
}
编辑:如果您不想设置DataContext
,您可以直接绑定(bind)到窗口:
<Window Name="window" ... />
<ListBox ItemsSource="{Binding NameList, ElementName=window}"/>
或者您可以将 AncestorBinding 用作
<ListBox ItemsSource="{Binding NameList, RelativeSource={RelativeSource AncestorType=Window}}"/>
但是,在这两种情况下,列表都是空的,因为 View 不会收到您在加载事件中填充列表这一事实的通知。因此,您需要使用 INPC 来通知 "NameList"
属性已更改。
关于c# - 将 ListBox 的 ItemsSource 设置为其包含类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12348436/