2015-06-21 86 views
0

我有一个类“裁剪”,它包含4个参数中变化的元素时,调用属性的设置方法:,物业

public class Cropping 
{ 
    public float Top { get; set; } 
    public float Bottom { get; set; } 
    public float Left { get; set; } 
    public float Right { get; set; } 
} 

在我的UI类,我有种植类的实例,即在set块中有一个方法调用来更新UI。

private Cropping croppingFactors; 
/// <summary>Stores details on how to crop the image</summary> 
public Cropping CroppingFactors 
{ 
    get { return croppingFactors; } 
    set 
    { 
    croppingFactors = value; 
    UpdateUIControls(); 
    } 
} 

这里的目的显然是要更新UI控件,每次的变化来裁剪因素中的一种制成,但是,如果我改变裁剪类中的元素,即,

CroppingFactors.Top = 5; 
呼叫

CroppingFactors属性的设置方法未运行。

当我更改类内的元素时,如何更新UI?

编辑

我意识到,一套属性将无法运行,因为我已经不是一个新的值设置为裁剪类。 我的问题是:当我更改Cropping类中的任何元素时,如何调用'UpdateUIControls()'方法?

编辑2

多亏了阿兰穆赫兰给出的答案 - 这里是我的完整实现:​​

我修改了裁剪类实现INotifyPropertyChanged类

public class Cropping : INotifyPropertyChanged 
{ 
    private float top; 
    public float Top 
    { 
    get { return top; } 
    set 
    { 
     top = value; 
     NotifyPropertyChanged(); 
    } 
    }  

    //Same for bottom, left and right 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged() 
    { 
    if(PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

然后在UI类中,我订阅了这个事件:

public ImgHost() 
{ 
    InitializeComponent(); 
    CroppingFactors.PropertyChanged += CroppingFactors_PropertyChanged; 
} 

private void CroppingFactors_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    UpdateUIControls(); 
} 

这就是我的实现,只是为了完整性。感谢所有的答案!

+0

你有什么不工作? –

+0

@roryap他修改'CroppingFactors'返回的'Cropping'对象 - 不设置属性。 – cubrr

+0

“* CroppingFactors属性的设置方法未运行。*”。当然,它并没有运行 - CroppingFactors属性没有被赋予不同的值,那为什么要执行setter?请注意,您将一个不同的值分配给Cropping对象的其中一个属性,但不会为CroppingFactors属性分配不同的值... – elgonzo

回答

3

执行Cropping类中的INotifyPropertyChanged接口。从使用Cropping类的UI类中订阅属性更改的事件作为属性,以便每次在Cropping类的任何成员上设置属性时,都可以调用所需的功能。

+0

这是正确的,但我不得不阅读两遍,可能会添加示例代码? –

0

无论何时发生任何变化,您都可以拨打UpdateUIControls(),但这取决于需要触发更改的内容。另一种方法是添加一个事件:

public event EventHandler PropertyUpdated; 

然后任何需要更新控制列表,可以调用在事件处理程序的控制方法。