لماذا هذا بسيط ربط البيانات السيناريو لا تعمل ؟ (تحرير وسرد ذات الصلة)

StackOverflow https://stackoverflow.com/questions/458636

سؤال

لقد تم الخدش رأسي على هذا واحد لفترة من الوقت الآن وأنا الحيرة في هذه اللحظة.

المشكلة السيناريو الأسهل لشرح كرمز لذلك نأمل أنه يتحدث عن نفسه.أولا وقبل كل شيء, لدي تطبيق 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"));
            }
        }
    }
}

لذلك اسمحوا لي أن أشرح...قررت أن أكتب عاما من إنشاء ObservableCollection له SelectedItem مكان الإقامة على ذلك أنه عندما ربط جمع إلى مربع تحرير وسرد على سبيل المثال, لا يمكن ربط تحرير وسرد هو SelectedItem الملكية لها.

ولكن لسبب ما لا يبدو أن العمل عند تحرير وسرد بشكل فعال المتداخلة عبر ItemTemplate.لدي فعال قائمة من قوائم السيناريو هو بسيط بما فيه الكفاية أنني فقدت ما هو الخطأ.

عند تشغيل التعليمات البرمجية سترى أن قالب مربع تحرير وسرد لا تلتقط العناصر الصحيحة ، لكنه أبدا تعيين SelectedItem على الرغم من ملزمة.

أعلم أنها طويلة نوعا ما ينضب ، لكن أي أفكار ؟

شكرا جزيلا

هل كانت مفيدة؟

المحلول

المصحح إخراج فعلا يعطيك تلميحا إلى المشكلة:

النظام.يقوم نظام ويندوز.خطأ في البيانات:BindingExpression طريق الخطأ: 'SelectedItem' الملكية لم يتم العثور على 'ExpressionElements.SomeClass' 'ExpressionElements.SomeClass' (HashCode=49044892).BindingExpression:Path='SelectedItem' DataItem='ExpressionElements.SomeClass' (HashCode=49044892);استهداف عنصر 'System.يقوم نظام ويندوز.الضوابط.تحرير وسرد' (اسم=");هدف المنشأة هو 'SelectedItem' (النوع 'System.الكائن')..

لأن البيانات سياق القالب مثيل SomeClass الدرجة, كل ما عليك القيام به هو تغيير SelectedItem ملزمة من SelectedItem إلى StringsChild.SelectedItem:

<DataTemplate x:Key="icTemplate">
    <ComboBox ItemsSource="{Binding StringsChild}" 
     SelectedItem="{Binding StringsChild.SelectedItem}"/>
</DataTemplate>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top