我有一个关于控件之间绑定的基本问题。
我有一个包含大量字段的类,我们称之为“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控件。
实现这一目标的正确方法是什么?如果有必要,我也会粘贴一些代码。
答案 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");
}