WPF освежающий контроль основной вопрос - PullRequest
0 голосов
/ 25 февраля 2010

У меня есть очень простой вопрос о связывании между элементами управления.

У меня есть класс, в котором есть несколько полей, давайте назовем его «Стиль». Одно из полей называется «Изображения» с только геттером и без сеттера. Затем у меня есть другой класс "StyleImages", который вызывается с конструктором "новый StyleImages (Style)" в геттере на классе "Стиль". Это означает, что каждый раз, когда я вызываю изображения в стиле, я всегда получаю свежие изображения, созданные для текущего стиля.

В WPF я создал окно. В XAML у меня есть два элемента управления. 1) Контроль изображения. 2) Управление PropertyGrid (из WF).

В коде позади я создаю новый экземпляр стиля. В PropertyGrid я нажимаю весь «Стиль», а в режиме управления изображениями я нажимаю Style.Images.Image1

Нет, то, что я хочу, это когда я изменяю любой атрибут «Style» в PropertyGrid, я хочу, чтобы элемент управления изображения обновлялся.

Как правильно достичь этого? При необходимости я также вставлю код.

Ответы [ 2 ]

1 голос
/ 25 февраля 2010

Всякий раз, когда вам нужно уведомить пользовательский интерфейс о том, что данные, с которыми он связан, тоже изменились, вы должны сделать это через интерфейс INotifyPropertyChanged.

Обычно я реализую базовый класс с именем BindableObject, который реализует интерфейс для меня.Затем везде, где мне нужно поднять уведомления об изменениях, которые я наследую от BindableObject, и вызвать PropertyChange ("Foo")

BindableObject выглядит следующим образом:

public class BindableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void PropertyChange(String propertyName)
    {
        VerifyProperty(propertyName);

        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    [Conditional("DEBUG")]
    private void VerifyProperty(String propertyName)
    {
        Type type = GetType();
        PropertyInfo info = type.GetProperty(propertyName);

        if (info == null)
        {
            var message = String.Format(CultureInfo.CurrentCulture, "{0} is not a public property of {1}", propertyName, type.FullName);
            //Modified this to throw an exception instead of a Debug.Fail to make it more unit test friendly
            throw new ArgumentOutOfRangeException(propertyName, message);
        }
    }

}

Тогда, когда мне нужно вызвать внутри свойстваУ меня есть что-то вроде этого (обычно на установщика свойств)

private String foo;    
public String Foo
{
get { return foo; }
set 
{
   foo = value;
PropertyChange("Foo");
}
1 голос
/ 25 февраля 2010

Вы должны сообщить, что недвижимость изменилась.

Рассмотрите возможность реализации INotifyPropertyChanged и INotifyPropertyChanging.

Каждый раз, когда изменяется любое другое свойство, вызывайте OnPropertyChanged («ImageControl»). Таким образом, структура ВПП узнает об изменении свойства и будет действовать соответственно.

Также убедитесь, что режим Binding установлен правильно, для целей отладки установите его = TwoWay.

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