c# - 将 ListBox 的 ItemsSource 设置为其包含类的属性

标签 c# wpf xaml binding itemssource

我有以下 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/

相关文章:

c# - 迁移后的 Reactive 6.5.0 ReactiveCommand

wpf - 如何让 WPF TextBlock 在多行上显示我的文本?

c# - 使用 Rfc2898DeriveBytes 将 C# PBKDF2 转换为 PHP

c# - 从/debug 目录中删除 mySolutionName.exe 文件。如何恢复或重建?

c# - WPF 绑定(bind)用空格替换零

c# - 为 Prism Eventaggregator WPF 使用通用的 PubSubEvents

c# - 如何为 DataGrid 设置透明背景?

c# - 使用自定义 WPF 控件时无法设置某些属性

c# - 通过 Microsoft Web API 端点调用 Web 服务 - asmx?

c# - 将字符串转换为时间跨度