2010-02-25 74 views
0

我有一个关于控件之间绑定的非常基本的问题。WPF刷新控制基本问题

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

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

在后面的代码中创建样式的新实例。在PropertyGrid我推图像控件中的所有“样式”我推Style.Images.Image1

没有什么我想要的是,当我更改PropertyGrid中“样式”的任何属性我希望图像控件刷新。

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

回答

1

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

考虑实施INotifyPropertyChanged和INotifyPropertyChanging。

每当其他属性发生变化时,调用OnPropertyChanged(“ImageControl”)。这样WFP框架将知道财产变化并将采取相应行动。

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

+0

这是否意味着我必须在类风格的所有memebers中实现它? 例如...如果“样式”有“笔画”和“笔画”有“颜色”,有字段...更改PropertyGrid中的这些字段之一,然后将要求INotifyPropertyChanged无处不在...有没有更简单(更优雅)的方式来做到这一点? – no9 2010-02-25 10:38:05

+0

可能存在一个,但现在我想不出更优雅的方式。 如果我脑子里发生什么事,我会写下来...抱歉不能再有任何帮助 – 2010-02-25 14:52:25

+0

我想我找到了一种使用PostSharp(使用方面)的方式。我会回报我的进度... – no9 2010-03-01 06:49:32

1

无论何时您需要通知UI该数据绑定的数据已经更改,您需要通过INotifyPropertyChanged界面进行更改。

通常我实现一个名为BindableObject的基类,它为我实现了接口。然后,无论我需要提高的更改通知我从BindableObject继承和调用的PropertyChange(“富”)

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"); 
} 
+0

这正是我的意思,但提供了一个很好的例子的附加价值 – 2010-02-25 18:31:38

+0

PropertyChanged处理程序总是为空......为什么是这样?我确实尝试过这个方法,但我仍然没有得到逻辑。你还可以添加一个简单的例子,你捕捉事件,所以我可以更新图像控制在我的例子?对不起,如果我问愚蠢的问题,但在新的C# – no9 2010-02-26 07:57:44