WPF刷新控制基本问题

时间:2010-02-25 10:15:46

标签: c# wpf

我有一个关于控件之间绑定的基本问题。

我有一个包含大量字段的类,我们称之为“Style”。 其中一个字段称为“图像”,只有getter而没有setter。 然后我有另一个类“StyleImages”,在类“Style”的getter中使用构造函数“new StyleImages(Style)”调用。这意味着每当我在Style上调用Images时,我总会获得为当前样式创建的新图像。

在WPF中,我创建了一个窗口。在XAML中,我有两个控件。 1)图像控制。 2)PropertyGrid控件(来自WF)。

在后面的代码中我创建了Style的新实例。在PropertyGrid中,我推送整个“Style”,而在Image控件中我推送Style.Images.Image1

没有我想要的是当我在PropertyGrid中更改“Style”的任何属性时,我希望刷新Image控件。

实现这一目标的正确方法是什么?如果有必要,我也会粘贴一些代码。

2 个答案:

答案 0 :(得分:1)

您需要通知该属性已更改。

考虑实施INotifyPropertyChanged和INotifyPropertyChanging。

每次更改任何其他属性时,请调用OnPropertyChanged(“ImageControl”)。通过这种方式,世界粮食计划署框架将知道财产已经改变并将采取相应行动。

此外,请确保正确设置绑定模式,出于调试目的,将其设置为= TwoWay。

答案 1 :(得分:1)

每当您需要通知UI时,绑定的数据也已更改,您需要通过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");
}