Синхронизация двух объектных заголовков с указателями в C# WPF

Я хотел бы синхронизировать два объектных заголовка с указателями. Например: Я знаю, что не могу сделать этого с текущим синтаксисом, но я хотел бы что-то как:

Node node = new Node();
node.Label = "header1";

TabItem tabItem = new TabItem;
*(tabItem.Header) = &(node.Label);

Таким образом каждый раз, когда я изменяюсь node.Label, tabItem.Header изменения также.

1
задан anon 9 July 2010 в 21:22
поделиться

2 ответа

Edit: added an example

Вы должны быть в состоянии достичь этого, используя привязку к базе данных. Если Node является пользовательским объектом, вы должны либо поддерживать INotifyPropertyChange, либо реализовать свойство Label как зависимое свойство. (Я не уверен, какова конвенция, я бы предположил, что если Node по своей сути является объектом UI, то используйте зависимое свойство, а если нет, то реализуйте INotifyPropertyChanged.

Пример: Объект Node:


    public class Node: System.ComponentModel.INotifyPropertyChanged
    {
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
        public string Label
        {
            get { return this._Label; }
            set
            {
                this._Label = value;
                this.OnPropertyChanged(new System.ComponentModel.PropertyChangedEventArgs("Label"));
            }
        }
        private string _Label;

        protected virtual void OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs propertyChangedEventArgs)
        {
            System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
            if (propertyChanged != null)
                propertyChanged(this, propertyChangedEventArgs);
        }
    }

Код вашей формы (этот метод устанавливает привязку к базе данных в коде, вы также можете установить привязку к базе данных в XAML):


    public partial class MainWindow : Window
    {
        public Node TheNode { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            this.TheNode = new Node();
            this.DataContext = this;
            this.Tab1.SetBinding(System.Windows.Controls.TabItem.HeaderProperty, "TheNode.Label");
            this.TheNode.Label = "Test";
        }
    }

XAML для вашей формы

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TabControl>
        <TabItem Name="Tab1"/>
    </TabControl>
</Grid>

Когда вы устанавливаете привязку к базе данных, WPF определит, что ваш объект Node реализует INotifyPropertyChanged, и автоматически подпишется на событие PropertyChanged.
(обратите внимание, что в коде MainWindow я устанавливаю привязку, а затем устанавливаю значение Node.Label - заголовок вкладки обнаруживает это и обновляется).

2
ответ дан 2 September 2019 в 23:09
поделиться

Вы пытались создать новую привязку для связывания двух свойств? Если Node - ваш собственный объект, реализуйте INotifyPropertyChanged. Вы можете сделать это как в коде, так и в XAML. Поскольку вы выглядите так, как будто делаете что-то внутри кода, вот ссылка, как это сделать: http://learnwpf.com/Posts/Post.aspx?postId=a089e315-9440-4f74-b872-ba6d14be7c80

0
ответ дан 2 September 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: