簡體   English   中英

如何以編程方式設置ItemsSource屬性?

[英]How to set ItemsSource property programmatically?

這是XAML代碼;

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

如何分配此ItemSource屬性的newTaskNameTextBox通過C#編程?

(WPF解決方案)

您應該使用TryFindResource方法。

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

這以與{StaticResource BankNamesList}相同的方式搜索邏輯樹。


更新:(WP8的解決方案)

聽起來您使用的是WP8 (不包括FindResource / TryFindResource ),所以請嘗試以下操作:

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

更新:(如何實現缺少的TryFindResource)

請注意,上面的代碼要求資源位於后面的代碼所有者(例如,窗口)中。 但是,在某些情況下,資源可能存在於邏輯樹上的另一個父元素中。 例如,您可能正在為自定義用戶控件編寫代碼,但是要查找的資源存在於MainWindow中。 對於這種情況,編寫WPF的TryFindResouces的基本實現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"]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM