Свойство зависимости GetValue в другом классе
Поэтому у меня возникли некоторые проблемы с работой моих Depency Properties. Но на самом деле, только если я пытаюсь получить доступ к ним из другого класса.
Например, я делаю проверку для проверки связи с сервером и определения соответствующего свойства зависимости:
public static DependencyProperty PingStateProperty =
DependencyProperty.Register("PingState", typeof(bool),
typeof(MainWindow));
public bool PingState
{
get { return (bool)GetValue(PingStateProperty); }
set
{
SetValue(PingStateProperty, value);
PropertyChanged(this, new PropertyChangedEventArgs("PingState"));
}
}
Теперь я хотел бы получить значение из свойства зависимости в другом классе (в частности, в пользовательском элементе управления). Так что у меня есть другой класс, где я пытаюсь получить значение, как это:
public void MethodInClass2()
{
bool ping = (bool)GetValue(MainWindow.PingStateProperty);
Что я тут не так делаю? Что меня беспокоит: это работает, когда я вызываю GetValue в том же классе. Это не дает мне ошибку компиляции или что-то в этом роде, похоже, просто не передается правильное значение (в классе 1, где определен DP, я могу проверить значение и получить "true", как и ожидалось, но при попытке сделать то же самое в классе 2, я просто получаю "ложь" каждый раз).
Нужно ли мне в таком случае присоединенное имущество? Немного пробовал с ними, но, к сожалению, безрезультатно.
Привет
3 ответа
Если вам нужно значение свойства, вам нужен экземпляр, который содержит значение, как указано в предыдущих комментариях и ответах. Получите экземпляр, используя сеттер / синглтон или любой другой, который вам подходит. Зависимость / прикрепленные свойства не решат вашу проблему. (Если вы хотите связать свойство, используйте свойство зависимости.)
Вы не можете получить значение, если вы не установили его ранее. И вы можете установить это значение только в том случае, если целевой объект имеет тот же тип или производный, если он не является присоединенным свойством. призвание GetValue
как это не получает свойство из главного окна, оно получает свойство из текущего экземпляра (ваш пользовательский элемент управления).
Никогда не помещайте дополнительный код в оболочку CLR (public bool PingState
). Он не вызывается системой привязки или иным образом при правильном доступе к свойству. Чтобы получить свойство, измененное обратным вызовом, используйте метаданные при регистрации собственности.
Благодаря @aQsu я смог разобраться в этом по-другому. Сейчас я использую Singleton, чтобы получить экземпляр, подобный следующему:
private static MainWindow _instance;
public static MainWindow Instance
{
get
{
if (_instance == null)
_instance = new MainWindow();
return _instance;
}
}
Затем просто позвонив в UserControl
bool ping = MainWindow.Instance.PingState;