Проблема привязки с CurrentItem в WPF C #, не удается получить доступ к «данным второго уровня» - PullRequest
0 голосов
/ 05 мая 2011

У меня проблема в c # wpf для привязки к CurrentItem, у меня есть список людей, и у каждого из них может быть один из двух элементов. Вы можете выбрать человека в списке, а затем выбрать его элемент в выпадающем списке.

Поле со списком связывается с Persons.CurrentItem.Item и показывает, что человек имеет в качестве выбранного элемента. Но я не могу изменить его, или, скорее, я не могу сохранить внесенное изменение, оно меняется обратно, как только я выбираю нового человека.

XAML выглядит так:

    <!--This dose not work-->
    <TextBox Height="23" HorizontalAlignment="Left" Margin="148,55,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Path=Persons.CurrentItem.Item.Name}"/>

    <!--This works-->
    <TextBox Height="23" HorizontalAlignment="Left" Margin="16,306,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Path=Persons.CurrentItem.Name}"/>

    <!--This works, we do not bind to CurrentItem-->
    <ListBox Height="274" HorizontalAlignment="Left" ItemsSource="{Binding Path=Persons2}" SelectedItem="{Binding Path=SelectedPerson}" Margin="292,26,0,0" Name="listBox2" VerticalAlignment="Top" Width="120" DisplayMemberPath="Name" />
    <ComboBox Height="23" HorizontalAlignment="Left" ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Path=SelectedPerson.Item}" Margin="431,26,0,0" Name="comboBox2" VerticalAlignment="Top" Width="120" DisplayMemberPath="Name"/>
</Grid>

Как видите, я добавил лиц2 с SelectedItem в качестве SelectedPerson. Это прекрасно работает, и я хочу имитировать его функцию, но я хочу использовать Текущий элемент.

Это код C #:

    // Selectable items
    public List<Item> Items { get; set; }

    // List of persons, we will bind to it's CurrentItem
    public List<Person> Persons { get; set; }

    // This works, we do not use CurrentItem
    public List<Person> Persons2 { get; set; }
    private Person _selectedPerson;
    public Person SelectedPerson
    {
        get { return _selectedPerson; }
        set
        {
            _selectedPerson = value;
            NotifyPropertyChanged("SelectedPerson");
        }
    }


    #region Constructo
    public Window()
    {
        InitializeComponent();
        DataContext = this;

        // Populate Items
        Items = new List<Item>
                    {
                        new Item {Name = "Hammer"},
                        new Item {Name = "Axe"}
                    };

        // Populate persons
        Persons = new List<Person>() { new Person { Name = "Lisa", Item = Items.FirstOrDefault()}, new Person { Name = "Kauf" } };
        Persons2 = new List<Person>(Persons); // make a copy
    }
    #endregion

    #region PropertyChangeHandler
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string name)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }
    #endregion
}

public class Item
{
    public string Name { get; set; }
}

public class Person
{
    public string Name { get; set; }
    private Item _item;
    public Item Item
    {
        get { return _item; }
        set
        {
            // We only accass this if we do not bind to CurrentItem
            _item = value;
        }
    }
}

Если вы протестируете пример, то увидите, что Persons.CurrentItem.Name работает, но Persons.CurrentItem.Item.Name не работает. Почему? Я что-то пропустил с уровнем доступа? Есть ли что-то, что я пропустил, как использовать CurrentItem?

Спасибо, что просветили меня.

1 Ответ

0 голосов
/ 09 мая 2011

Задал тот же вопрос на MSDN: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/18eee956-3a91-4db3-a4ff-7e8d127ae301

Решение состоит не в том, чтобы использовать CurentItem, а вместо этого, например:

<StackPanel>
      <ListBox ItemsSource="{Binding Path=Persons}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Name" />
      <ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Persons/Item}" DisplayMemberPath="Name"/>
</StackPanel>
...