这是XAML代码;
<toolkit:AutoCompleteBox x:Name="newTaskNameTextBox"
ItemsSource="{StaticResource BankNamesList}" />
如何通过C#以编程方式将此ItemSource
属性分配给newTaskNameTextBox
?
答案 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"]);