我一直在抓我的头就这一个了一会儿,此刻的我难住了。

在问题的情况是比较容易作为代码来解释所以希望它是不言而喻的。首先,我有一个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>

我的代码隐藏看起来像这样...(全部写在一个类文件,这样很容易让你把它复制到自己的项目并编译)

namespace SilverlightApplication2
{
    public partial class Page : UserControl
    {
        public ObservableCollection<SomeClass> StringsParent { get; set; } 

        public Page()
        {   
            InitializeComponent();
            StringsParent = new ObservableCollection<SomeClass>();
            ic.ItemsSource = StringsParent;
        }

        private void Save(object sender, RoutedEventArgs e)
        {
            SomeClass c = new SomeClass();
            c.StringsChild.Add("First");
            c.StringsChild.Add("Second");
            c.StringsChild.SetSelectedItem("Second");
            StringsParent.Add(c);
        }
    }

    public class SomeClass
    {
        public SelectableObservablecollection<string> StringsChild { get; set; }

        public SomeClass()
        {
            StringsChild = new SelectableObservablecollection<string>();
        }    
    }

    public class SelectableObservablecollection<T> : ObservableCollection<T>
    {
        public SelectableObservablecollection()
            : base()
        {

        }

        public void SetSelectedItem<Q>(Q selectedItem)
        {
            foreach (T item in this)
            {
                if (item.Equals(selectedItem))
                {
                    SelectedItem = item;
                    return;
                }
            }
        }

        private T _selectedItem;
        public T SelectedItem
        {
            get
            {
                return _selectedItem;
            }
            set
            {
                _selectedItem = value;
                OnPropertyChanged(new PropertyChangedEventArgs("SelectedItem"));
            }
        }
    }
}

因此,让我解释... 我开始写创建具有的SelectedItem 属性就可以了,这样,当我收集绑定到例如组合框,我可以绑定组合框的的SelectedItem 属性吧。

然而,由于某些原因,它似乎并不当ComboBox被有效地通过一个ItemTemplate嵌套工作。我有效地具有一个列表的列表,一个场景是很简单,我迷路了,什么是错的。

当你运行你会看到模板组合框不会拿起正确的项目代码,但它从来没有设置到的SelectedItem尽管结合。

我知道这是相当长篇大论,但...任何想法?

很多

由于
有帮助吗?

解决方案

在调试器输出实际上给你提示的问题:

System.Windows.Data错误:BindingExpression路径错误:<强> '的SelectedItem' 属性不是 'ExpressionElements.SomeClass' 'ExpressionElements.SomeClass'(的HashCode = 49044892)中找到。 BindingExpression:路径= '的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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top