3

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

我想将 设置NameListItemsSource来自 xaml 的 ListBox,而不是来自代码隐藏。我怎么做?

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

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

4

1 回答 1

2

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

在 XAML 中设置绑定:

<ListBox ItemSource="{Binding NameList}"/>

并在您填充列表后设置为,例如在DataContext事件中:thisWindow_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"属性发生了变化。

于 2012-09-10T09:11:51.763 回答