【问题标题】:Setting ItemsSource of ListBox to a property of it's containing class将 ListBox 的 ItemsSource 设置为其包含类的属性
【发布时间】:2012-09-10 09:05:32
【问题描述】:

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

我想将 xaml 中的 NameList 设置为 ListBox 的 ItemsSource不是 来自代码隐藏。我怎么做?

编辑:我知道这样做的 MVVM 方式。但这不是我要问的

编辑: 并不是我不喜欢 MVVM 左右。在进行一些快速测试时,我才意识到我不知道该怎么做。所以,想知道这是否可能,并尝试学习。无论如何可以使用StaticResource吗?

【问题讨论】:

  • 请解释为什么你拒绝使用MVVM,也不想使用后面的代码来设置列表。您已经在使用后面的代码来创建列表。为什么不把它放在那里?
  • @DanielHilgarth:这不是拒绝或类似的事情。为了进行快速测试,我只是卡在这里,并意识到我不知道该怎么做。所以我只是想学习。
  • 谢谢。我在问,因为使用与大多数人推荐的方式不同的方式的动机会影响我给出的答案。

标签: c# wpf xaml binding itemssource


【解决方案1】:

如果您的意思是“不采用 MVVM 方式”并且不想使用 ViewModel,那么您 可以通过以下步骤将数据绑定到“代码隐藏”:

在 XAML 中设置绑定:

<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你可以直接绑定到窗口:

<Window Name="window" ... />

  <ListBox  ItemsSource="{Binding NameList, ElementName=window}"/>

或者你可以使用 AncestorBinding 作为

<ListBox ItemsSource="{Binding NameList, RelativeSource={RelativeSource AncestorType=Window}}"/>

但是,在这两种情况下,列表都是空的,因为您在加载的事件中填充了列表这一事实不会通知视图。所以需要使用INPC来通知"NameList"属性发生了变化。

【讨论】:

  • 不设置DataContext可以吗?抱歉,我忘了在问题中提及这一点。
  • 要使 DataBinding 正常工作,您需要在某处设置 DataContext
  • 在这种情况下,您不必设置 DataContext。您想将 ListBox 绑定到作为 ListBoxes 祖先的 windows 属性。所以只需绑定到它的祖先:stackoverflow.com/questions/84278/…
  • @NerotheZero 不是使用 StaticResoure,而是使用 ElementName 或使用 RelativeSource。请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2016-11-05
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2021-01-25
相关资源
最近更新 更多