从SL3升级 - > SL4。第一个问题:这会引发解析器异常:
<StackPanel Name={Binding} /> (same with x:Name)
收集是ObservableCollection<string>
。在SL3中工作得很好。所以似乎SL4不允许绑定到Name属性。咦?
所以:改为
<StackPanel Tag={Binding} />
...因为我只需要在后面的代码中识别控件。所以这就是错误('因为这必须是一个错误!):
在此frag中,AllAvailableItems是ObservableCollection<string>
:
<ItemsControl Name="lbItems"
ItemsSource="{Binding AllAvailableItems}"
Height="Auto"
Width="Auto"
BorderBrush="Transparent"
BorderThickness="0"
VerticalAlignment="Top"
HorizontalAlignment="Left"
Margin="12,6,0,0">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<CheckBox Tag="{Binding}"
Checked="ItemChecked_Click"
Unchecked="ItemUnchecked_Click"
Style="{StaticResource CheckBoxStyle}"
Grid.Row="0">
<CheckBox.Content>
<TextBlock Text="{Binding}"
Style="{StaticResource FormLJustStyle}" />
</CheckBox.Content>
</CheckBox>
<StackPanel Tag="{Binding}"
Orientation="Vertical"
Grid.Row="1">
<configControls:ucLanguage /> <!-- simple user control -->
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
在后面的代码中,我使用递归函数来查找提供了Name或Tag属性的Dependency对象:
public static T FindVisualChildByName<T>(DependencyObject parent, string name, DependencyProperty propToUse) where T : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(propToUse) as string;
if (controlName == name)
{
return child as T;
}
else
{
T result = FindVisualChildByName<T>(child, name, propToUse);
if (result != null)
return result;
}
}
return null;
}
好的,得到这个:在后面的代码中,我可以获得XAML中第一个ORDERED的控件!换句话说,如果我先放置CheckBox,我可以检索CheckBox,但不能检索StackPanel。反之亦然。这一切在SL3中都运行良好。
任何帮助,想法......?
谢谢 - 库尔特
答案 0 :(得分:0)
这不是错误。
您的循环永远不会超过第一个对象,因为您在第一次匹配时返回该孩子。
将其添加到集合中,然后返回集合。
像这样:
public static IEnumerable<T> FindVisualChildrenByName<T>(DependencyObject parent, string name, DependencyProperty propToUse) where T : DependencyObject
{
List<T> children = new List<T>();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
string controlName = child.GetValue(propToUse) as string;
if (controlName == name)
{
children.add(child as T);
}
// ...
}
return children;
}
修改强> 当然,这被授予您不使用return子元素多次调用代码。在这种情况下,您应该提供调用方法代码,以便我们可以看到您正在做什么。