Обновите XAML TextBlock значением публичного свойства из другого класса - PullRequest
0 голосов
/ 03 февраля 2019

Я имею в своем решении C # WPF следующее: Mainwindow с startupControl (всегда запущенным) Dialogwindow с различными другими элементами управления.Открытый класс Helper, содержащий некоторые общедоступные статические свойства, чтобы указать, какой отдел в клиенте активен, и для кого я в данный момент сосредоточен.

Я хочу, чтобы просто два текстовых блока XAML, отображаемых в моем Startupcontrol, отображали свойствоимена, если и когда было установлено значение для отдела или заказчика.

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

Можно ли каким-либо образом из моих элементов управления в моем диалоговом окне изменить значение 2 текстовых блоков в Startupcontrol?

Поскольку программа небольшая, и я точно знаю, когда значения меняются, я думаю,я мог бы сделать функцию, устанавливающую значение ex .:

activeDepartmentTextBlock.Text = HelperClass.ActiveDepartment.Name;

Но из моего control.cs в DialogWindow, кажется, можно достичь activeDepartmentTextBlock.

Любой, кто может помочьмне ?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Начиная с WPF 4.5, привязка к статическим свойствам с уведомлением об изменении свойства довольно проста.

В приведенном ниже примере предполагается, что вы хотите уведомить об изменении свойства ActiveDepartment HelperClass (а не о* Name свойство объекта «Отдел»).В дополнение к статическому свойству объявите статическое событие с именем StaticPropertyChanged и запустите его при изменении статического свойства:

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

public class HelperClass
{
    public static event PropertyChangedEventHandler StaticPropertyChanged;

    private static Department activeDepartment;

    public static Department ActiveDepartment
    {
        get => activeDepartment;
        set
        {
            activeDepartment = value;
            StaticPropertyChanged?.Invoke(null,
                new PropertyChangedEventArgs(nameof(ActiveDepartment)));
        }
    }
}

Вы можете привязать статическое свойство следующим образом:

<TextBlock Text="{Binding Path=(local:HelperClass.ActiveDepartment).Name}"/>
0 голосов
/ 03 февраля 2019

Binding - хорошее решение, но у вас есть статическое свойство, поэтому вы не можете напрямую использовать инфраструктуру привязки для получения уведомлений об обновлениях, поскольку нет DependencyObject (или экземпляра объекта, которыйреализовать INotifyPropertyChanged).

Если значение действительно меняется, и вам нужно обновить значение TextBlock в главном окне, вы можете создать синглтон вместо статического класса, чтобы содержатьзначение и привязка к нему.

Пример синглтона:

public class HelperClass : DependencyObject {
    public static readonly DependencyProperty ActiveDepartmentProperty =
        DependencyProperty.Register( "ActiveDepartment", typeof( Department ),
        typeof( HelperClass ), new UIPropertyMetadata( "" ) );
    public Department ActiveDepartment {
        get { return (Department) GetValue( ActiveDepartmentProperty ); }
        set { SetValue( ActiveDepartmentProperty, value ); }
    }

    public static HelperClass Instance { get; private set; }

    static HelperClass() {
        Instance = new HelperClass();
    }
}

Таким образом, привязка будет работать, как в примере ниже:

<TextBox Text="{Binding Source={x:Static local:HelperClass.Instance}, Path=ActiveDepartment.Name}"/>

Это может выглядеть тактрудный путь и все.Вместо этого вы можете использовать модель событий и добавить событие к вашему HelperClass.MainWindow может добавить обработчик события и изменить значение activeDepartmentTextBlock при возникновении события.

public MainWindow()
{
    InitializeComponent();
    HelperClass.Instance.DepartmentChanged += OnDepartmentChanged;
}

private void OnDepartmentChanged(Department newDepartment)
{
    activeDepartmentTextBlock.Text = newDepartment.Name;
}

Обновление .Если вы хотите получить самое простое решение, вы можете нарушить принцип инкапсуляции и передать MainWindow в качестве параметра DialogWindow и сделать activeDepartmentTextBlock общедоступным.Таким образом, вы сможете сохранить ссылку на MainWindow в поле DialogWindow и просто изменить текст, когда вам нужно, в DialogWindow:

this.mainWindow.activeDepartmentTextBlock.Text = HelperClass.ActiveDepartment.Name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...