Silverlight 为什么这个简单的数据绑定场景不起作用?(与组合框相关)

Silverlight 为什么这个简单的数据绑定场景不起作用?(与组合框相关),silverlight,data-binding,combobox,selecteditem,itemssource,Silverlight,Data Binding,Combobox,Selecteditem,Itemssource,我已经为这件事挠头好一阵子了,现在我很为难 问题场景更容易解释为代码,所以希望它能说明问题本身。首先,我有一个silverlight应用程序,在XAML中包含以下内容 <UserControl x:Class="SilverlightApplication2.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/

我已经为这件事挠头好一阵子了,现在我很为难

问题场景更容易解释为代码,所以希望它能说明问题本身。首先,我有一个silverlight应用程序,在XAML中包含以下内容

<UserControl x:Class="SilverlightApplication2.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Width="400" Height="300">

<UserControl.Resources>
    <DataTemplate x:Key="icTemplate">
        <ComboBox ItemsSource="{Binding StringsChild}" SelectedItem="{Binding SelectedItem}"/>
    </DataTemplate>
</UserControl.Resources>

<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ItemsControl x:Name="ic" ItemTemplate="{StaticResource icTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>

    <Button Click="Save" Grid.Row="1" Content="GO"/>
</Grid>

我的代码看起来是这样的…(所有代码都写在一个类文件中,这样您就可以轻松地将其复制到自己的项目中并进行编译)

名称空间SilverlightApplication2
{
公共部分类页面:UserControl
{
公共可观测集合StringsParent{get;set;}
公共网页()
{   
初始化组件();
StringsParent=新的ObservableCollection();
ic.ItemsSource=StringsParent;
}
私有无效保存(对象发送方,路由目标)
{
SomeClass c=新的SomeClass();
c、 StringsChild.添加(“第一”);
c、 StringsChild.添加(“第二”);
c、 StringsChild.SetSelectedItem(“第二”);
加入(c);
}
}
公共类
{
public selectableobservecollection StringsChild{get;set;}
公共类()
{
StringsChild=新的SelectableObservablecollection();
}    
}
公共类SelectableObservablecollection:ObservableCollection
{
公共可选择的ObservableCollection()
:base()
{
}
公共无效设置selectedItem(Q selectedItem)
{
foreach(本文件中的T项)
{
if(item.Equals(selectedItem))
{
选择editem=项目;
返回;
}
}
}
私人T_selectedItem;
公共T选择项
{
得到
{
返回_selectedItem;
}
设置
{
_选择editem=值;
OnPropertyChanged(新PropertyChangedEventArgs(“SelectedItem”);
}
}
}
}
所以让我解释一下。。。 我开始编写一种创建ObservableCollection的通用方法,它有一个SelectedItem属性,这样当我将集合绑定到一个组合框时,我就可以将组合框的SelectedItem属性绑定到它

但是,由于某些原因,当ComboBox通过ItemTemplate有效嵌套时,它似乎不起作用。实际上,我有一个列表列表,一个非常简单的场景,我不知道哪里出了问题

当您运行代码时,您将看到模板化的ComboBox确实拾取了正确的项,但是它从未设置为SelectedItem,尽管有绑定

我知道这有点冗长,但是…有什么想法吗


非常感谢

调试器输出实际上为您提供了问题的提示:

System.Windows.Data错误:BindingExpression路径错误:在“ExpressionElements.SomeClass”上未找到“SelectedItem”属性。“ExpressionElements.SomeClass”(HashCode=49044892)。BindingExpression:Path='SelectedItem'DataItem='ExpressionElements.SomeClass'(HashCode=49044892);目标元素是“System.Windows.Controls.ComboBox”(名称=“”);目标属性为“SelectedItem”(类型为“System.Object”)

因为模板的数据上下文是SomeClass类的实例,所以您只需将SelectedItem绑定从SelectedItem更改为StringsChild。SelectedItem:

<DataTemplate x:Key="icTemplate">
    <ComboBox ItemsSource="{Binding StringsChild}" 
     SelectedItem="{Binding StringsChild.SelectedItem}"/>
</DataTemplate>


谢谢你,迈克尔。我不知道为什么我从不费心去看调试器输出(可能是因为它在大部分情况下编译并运行得很好)这一课。再次感谢:)不客气。我在模板制作方面有很多乐趣;它非常强大:
<DataTemplate x:Key="icTemplate">
    <ComboBox ItemsSource="{Binding StringsChild}" 
     SelectedItem="{Binding StringsChild.SelectedItem}"/>
</DataTemplate>