如何以编程方式设置 ItemsSource 属性

本文关键字:设置 ItemsSource 属性 方式 编程 | 更新日期: 2023-09-27 18:30:39

这是 XAML 代码;

<toolkit:AutoCompleteBox x:Name="newTaskNameTextBox"
                         ItemsSource="{StaticResource BankNamesList}" />

如何通过 C# 以编程方式将此ItemSource属性分配给newTaskNameTextBox

如何以编程方式设置 ItemsSource 属性

(WPF 解决方案)

您应该使用 TryFindResource 方法。

newTaskNameTextBox.ItemsSource = 
    (IEnumerable)newTaskNameTextBox.TryFindResource("BankNamesList");

这将以与{StaticResource BankNamesList}相同的方式向上搜索逻辑树。


更新:(WP8的解决方案)

听起来您正在使用WP8(不包括FindResource/TryFindResource),因此请尝试以下操作:

newTaskNameTextBox.ItemsSource = (IEnumerable)Resources["BankNamesList"];

更新:(如何实现缺少的TryFindResource)

请注意,上面的代码要求资源存在于此代码的所有者后面(例如窗口)中。但是,在某些情况下,资源可能存在于逻辑树上的另一个父元素中。例如,您可能正在为自定义用户控件编写代码隐藏,但您要查找的资源存在于 MainWindow 中。对于这种情况,编写WPF TryFindResouces的基本实现不会太难,它具有搜索逻辑树(源链接)的优点

public static class FrameworkElementExtensions
{
    public static object TryFindResource(this FrameworkElement element, object resourceKey)
    {
        var currentElement = element;
        while (currentElement != null)
        {
            var resource = currentElement.Resources[resourceKey];
            if (resource != null)
            {
                return resource;
            }
            currentElement = currentElement.Parent as FrameworkElement;
        }
        return Application.Current.Resources[resourceKey];
    }
}
/**********************************************************************/
// Or, the recursive version of TryFindResource method as suggested by @Default:
public static object TryFindResource(this FrameworkElement element, object resourceKey)
{
    if (element == null)
        return Application.Current.Resources[resourceKey];
    var resource = element.Resources[resourceKey];
    if (resource != null)
    {
        return resource;
    }
    return TryFindResource(element.Parent, resourceKey);
}

因此,如果您在命名空间中包含此FrameworkElementExtensions类,那么您应该能够执行此操作(与我最初为 WPF 提供的代码相同):

newTaskNameTextBox.ItemsSource = 
    (IEnumerable)newTaskNameTextBox.TryFindResource("BankNamesList");

如果BankNamesList是窗口资源中的资源,那么在代码中你可以执行以下操作:

newTaskNameTextBox.ItemsSource = Resources["BankNamesList"]

试试这个:

newTaskNameTextBox.ItemsSource = (IEnumerable)(Application.Current.Resources["BankNamesList"]);