이 간단한 데이터 바인딩 시나리오가 작동하지 않는 이유는 무엇입니까? (Combobox 관련)

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

문제

나는 지금이 머리를 긁고 있는데 지금은 잠시 동안 머리를 긁어 모았고 지금은 혼란에 빠졌다.

문제 시나리오는 코드로 설명하기가 더 쉽기 때문에 자체적으로 말하기를 바랍니다. 우선, XAML에 다음과 같은 Silverlight 응용 프로그램이 있습니다 ...

<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>

내 Code-Behind는 다음과 같습니다 ... (모두 단일 클래스 파일로 작성하여 자신의 프로젝트에 복사하고 컴파일 할 수 있습니다)

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"));
            }
        }
    }
}

그래서 설명하겠습니다 ... 나는 선택된 시티 템 예를 들어 컬렉션을 Combobox에 묶을 때 Combobox의 묶을 수 있도록 속성 선택된 시티 템 그것에 대한 속성.

그러나 어떤 이유로 든 Combobox가 ItemTemplate을 통해 효과적으로 중첩 될 때 작동하지 않는 것 같습니다. 효과적으로 목록 목록을 가지고 있습니다. 시나리오는 무엇이 잘못되었는지에 대해 잃어버린 것만 큼 간단합니다.

코드를 실행하면 템플릿 콤보 박스가 올바른 항목을 선택하지만 바인딩에도 불구하고 선택된 시합으로 설정되지 않습니다.

나는 그것이 오랫동안 바람이 불고 있다는 것을 알고 있지만 ... 어떤 아이디어가 있습니까?

정말 감사합니다

도움이 되었습니까?

해결책

디버거 출력은 실제로 문제에 대한 힌트를줍니다.

System.Windows.Data 오류 : BindingExpression 경로 오류 : 'SelectedItem'속성 'ExpressionElements.someclass'에서 찾을 수 없습니다. 'ExpressionElements.someclass'(Hashcode = 49044892). bindingexpression : path = 'selectedItem'dataIitem = 'expressionElements.someClass'(hashcode = 49044892); 대상 요소는 'system.windows.controls.combobox'(name = '')입니다. 대상 속성은 'selectedItem'(type 'system.object')입니다.

템플릿의 데이터 컨텍스트는 SomeClass 클래스의 인스턴스이므로 선택한 시합 바인딩을 선택된 시민에서 변경하기 만하면됩니다. stringschild.selectedItem:

<DataTemplate x:Key="icTemplate">
    <ComboBox ItemsSource="{Binding StringsChild}" 
     SelectedItem="{Binding StringsChild.SelectedItem}"/>
</DataTemplate>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top