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

时间:2013-09-07 06:18:09

标签: c# xaml windows-phone-8 windows-phone

这是XAML代码;

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

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

3 个答案:

答案 0 :(得分:4)

(WPF解决方案)

您应该使用TryFindResource方法。

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

这会搜索逻辑树,方式与{StaticResource BankNamesList}相同。


更新:( WP8解决方案)

听起来你正在使用 WP8 (不包括FindResource / TryFindResource),所以请尝试这样做:

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

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

请注意,上面的代码要求资源存在于此代码的所有者后面(例如窗口)。但是,可能存在资源存在于逻辑树中的另一个父元素中的情况。例如,您可能正在为自定义用户控件编写代码,但您正在寻找的资源存在于MainWindow中。对于这种情况,编写WPF TryFindResouces的基本实现并不难,它具有搜索逻辑树(source link)的优点:< / p>

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");

答案 1 :(得分:0)

如果BankNamesList是窗口资源中的资源,那么在后面的代码中你可以这样做:

newTaskNameTextBox.ItemsSource = Resources["BankNamesList"]

答案 2 :(得分:0)

试试这个:

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