Привязка из внешнего класса в WPF - PullRequest
0 голосов
/ 07 октября 2019

У меня есть TextBlock , привязанный вручную в MainWindow.xaml

<TextBlock Name="TestPrice"
                           Height="30"
                           HorizontalAlignment="Stretch"
                           VerticalAlignment="Stretch"
                           Text="{Binding Path=
                           ScreenMarketLogger, Mode=Default, UpdateSourceTrigger=PropertyChanged}"/> 

В MainWindow.xaml.cs Я определяю класс со свойствами:

public class ScreenLoggerBind : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;


            private string _ScreenMarketLogger;
            public string ScreenMarketLogger
            {
                get
                {
                    return _ScreenMarketLogger;
                }
                set
                {
                    _ScreenMarketLogger = value;
                    OnPropertyChanged("ScreenMarketLogger");
                }
            }

            private string _CurrentPrice;
            public string CurrentPrice
            {
                get
                {
                    return _CurrentPrice;
                }
                set
                {
                    _CurrentPrice = value;
                    OnPropertyChanged("CurrentPrice");
                }
            }

            private void OnPropertyChanged(string name)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
            }

            public ScreenLoggerBind()
            {
                this.ScreenMarketLogger = "\r\n begin \r\n";
            }
        }

У меня есть другой класс (физически это отдельный файл), где я определяю конструктор для ScreenLoggerBind класса.

class ExternalClass
{
...
ScreenLoggerBind ScreenLogger = new ScreenLoggerBind();
...
}

Теперь я передаю DataContext в этоткласс, подобный этому:

 public void Init(MainWindow mw)
        {
            mw.TestPrice.DataContext = ScreenLogger;
        }

И вызов этой функции в MainWindow.xaml.cs в mainWindow методе, подобном этому

ExternalClass ext = new ExternalClass()     
public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        ext.Init(this);
    }

И если я присваиваю значение переменной ScreenLogger.ScreenMarketLogger , я вижу результат в основной форме WPF. Здесь все работает правильно.

Теперь вопрос. Если я создаю компонент динамически в MainWindow.xaml.cs , например, так:

    Label lbl_Price = new Label();
    lbl_Price.Name = string.Format("lbl_Price_{0}{1}", i.ToString(), cell.ToString());
    Binding lbl_PriceBinding = new Binding("Content");
    lbl_PriceBinding.Source = ScreenLogger.CurrentPrice;
    lbl_PriceBinding.Mode = BindingMode.Default;
    lbl_PriceBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
    lbl_Price.SetBinding(Label.ContentProperty, lbl_PriceBinding);
....

И определяю DataContext во внешнем классе ExternalClass.cs

 public void Init(MainWindow mw)
        {
            mw.TestPrice.DataContext = ScreenLogger;
 foreach (Label lbl in mw.ChainGrid.Children.OfType<System.Windows.Controls.Label>())
            {
                if (lbl.Name == "lbl_XName_Price_00")
                {
 lbl.DataContext = ScreenLogger;
                }
            }
        }

Это не работает! Я вижу созданную динамически метку на главной форме. Но если я присваиваю значение переменной ScreenLogger.CurrentPrice , я не вижу никаких изменений.

Почему? где я ошибся?

1 Ответ

2 голосов
/ 07 октября 2019

Попробуйте сделать следующим образом:

Binding lbl_PriceBinding = new Binding("CurrentPrice");
lbl_PriceBinding.Source = ScreenLogger;
lbl_PriceBinding.Mode = BindingMode.OneWay;

Необходимо указать путь к свойству источника в конструкторе Binding. В вашем случае источник - ScreenLogger, а путь относительно него - CurrentPrice.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...