WPF - есть ли способ привязки к SelectedValues ​​как TreeView, так и ListBox? - PullRequest
0 голосов
/ 18 декабря 2010

Мне нужно привязать так, чтобы Контент элемента управления контентом был установлен в SelectedValue TreeView или ListBox. Значение SelectedValue, которое было изменено совсем недавно, должно предоставлять содержимое для ContentControl.

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

Мне удалось заставить это работать, используя следующую концепцию.

  1. Привязать элемент управления содержимым к свойству только для чтения «SelectedItem» (с частным свойством _selectedItem).
  2. BindListBox.SelectedItem для свойства чтения / записи "SelectedItemLB".
  3. В установщике SelectedItemLB установите значение _selectedItem и создайте событие PropertyChanged для SelectedItem.
  4. Создание обработчика для VreeView.SelectedItemChanged, который устанавливает значение _selectedItem и вызывает событие PropertyChanged для SelectedItem.

Вот мой полный код:

public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            this.items = new List<object>();
            this.items.Add(new Car("Green"));
            this.items.Add(new Car("Blue"));
            this.items.Add(new Car("Red"));

            this._selectedItem = this.items[0];
            this.treeView1.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(treeView1_SelectedItemChanged);
            this.DataContext = this;
        }

        void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            this._selectedItem = treeView1.SelectedItem;
            PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem"));
        }
        private List<object> items;

        public List<object> Items
        {
            get { return items; }
            set { items = value; }
        }


        public object SelectedItemLB
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                if (this.PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("SelectedItem"));
                }
            }
        }

        private object _selectedItem;
        public object SelectedItem
        {
            get { return _selectedItem; }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

XAML довольно прост:

<StackPanel>

    <ListBox Name="listBox1" ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Path=SelectedItemLB, Mode=TwoWay}" ></ListBox>
    <TreeView Name="treeView1" ItemsSource="{Binding Path=Items}">
        <TreeView.Resources>
            <Style TargetType="TreeViewItem">
                <Setter Property="IsSelected" Value="{Binding Path=IsSelected}"></Setter>
            </Style>
        </TreeView.Resources>
    </TreeView>
    <ContentControl Content="{Binding Path=SelectedItem.Color}"></ContentControl>
</StackPanel>
1 голос
/ 18 декабря 2010

Я не могу придумать, как сделать это напрямую.Однако есть несколько простых решений.

A.Используйте события для установки Content

Просто подключите общий обработчик к SelectedValueChanged событиям ваших ItemsControl с.Всякий раз, когда один из них меняет свой выбор, обработчик установит Content на то, что было выбрано.Я думаю, что это самое простое.

B.Используйте промежуточные свойства

Свяжите SelectedValue каждого ItemsControl с свойством.В установщике свойства также установите Content равным value.Это позволяет вам использовать привязку данных вместо обработчиков событий, но все же требует от вас написания кода, и это не слишком дорого для вас.Конечно, если вы уже привязываетесь к свойствам для других целей, дополнительных затрат почти нет (только назначение в каждом установщике), поэтому этот метод может быть предпочтительнее.

...