2017-04-27 35 views
0

更新:我的問題最初是針對格式問題以及來自多個其他屬性的「派生」屬性。我認爲這是相同的情況,但正如你從Fabios回答中看到的那樣,情況並非如此。我已經改變了這個問題一點,要明確說明它不是只是格式。INotifyPropertyChanged是否可以影響派生函數

我正在使用單向數據綁定的WinForms和INotifyPropertyChanged來更新表單。但我無法弄清楚它是如何影響派生函數的。例如可以說我有一個返回的價格爲十進制的函數:

public decimal price 
{ 
    get { return _price; } 
    set 
    { 
     // Set price and notify that it was changed 
     _price = value; 
     InvokePropertyChanged(new PropertyChangedEventArgs("price"); 
    } 
} 

另一個特性是負責貨幣代碼,這也可以改變:

public decimal currency 
{ 
    get { return _currency; } 
    set 
    { 
     _currency = value; 
     InvokePropertyChanged(new PropertyChangedEventArgs("currency"); 
    } 
} 

當價格或貨幣被改變(設置),屬性改變功能被調用。不過,我希望在我的GUI中顯示它之前,將此值格式化並使用貨幣代碼。所以,我把我的數據綁定到派生功能:

public string formattedPrice 
{ 
    get { return string.Format("{0:n0} {1}", price, currency) 
} 

將如何改變pricecurrency影響formattedPrice?顯然我一直在做自己的一些測試,但我似乎無法找到邏輯?該InvokepropertyChanged函數的定義是這樣的:

public event PropertyChangedEventHandler PropertyChanged; 
public void InvokePropertyChanged(PropertyChangedEventArgs e) 
{ 
    PropertyChangedEventHandler handler = PropertyChanged; 
    if (handler != null) handler(this, e); 
} 
+0

有_many_方式來處理這一點。請參閱標記的重複選項。就個人而言,我更願意保持我的INPC屬性完全免費的自定義邏輯。相反,我使用一個基礎實現,它允許setter掛鉤回調,並在該回調中處理屬性特定的行爲。然後就像你正在談論的東西,在這樣的回調只是設置「派生」屬性(一個不幸的單詞選擇恕我直言,鑑於「派生」在OOP中有一個特定的,完全不相關的意義)到一個新的價值。是的,有更多的後臺字段,但代碼更簡單。 –

+0

@PeterDuniho - 我認爲這個問題的具體情況更多地與格式化值有關。你提供的「相關」答案將導致OP和未來的讀者向錯誤的方向發展。 – Fabio

+0

所以這就是從零開始到火箭科學:-)。我對你的意思是「讓我的INPC屬性完全免費定製邏輯」有點困惑。我對C#還是有點新鮮,所以我必須承認,我並不確定我的InvokePropertyChanged函數是如何工作的。你可以在代碼中顯示它嗎? – Noceo

回答

1

你可以簡單地調用的PropertyChanged用於格式化值在二傳手

public decimal price 
{ 
    get { return _price; } 
    set 
    { 
     _price = value; 
     InvokePropertyChanged(new PropertyChangedEventArgs("price"); 
     InvokePropertyChanged(new PropertyChangedEventArgs("formattedPrice"); 
    } 
} 

但是,由於格式化值更UI(視圖)的責任 - 你可以把它移到窗戶通過使用Binding.Format事件形成一側,並保留price屬性。

public decimal price 
{ 
    get { return _price; } 
    set 
    { 
     _price = value; 
     InvokePropertyChanged(new PropertyChangedEventArgs("price"); 
    } 
} 

// In windows form 
var priceBinding = new Binding("Text", sourceObject, "price", true); 
priceBinding.Format += (sender, args) => 
{ 
    var price = (decimal)args.Value; 
    args.Value = string.Format("{0:n0} EUR", price); 
} 

priceTextBox..DataBindings.Add(priceBinding); 

更多Binding.Format Event

+0

這就是我目前正在做的。我只是想知道是否有辦法避免跟蹤鏈接。在這個例子中,我給了它很簡單,但在較大的程序鏈變長(和分支可能會發生),因此難以跟蹤...... – Noceo

+0

@Noceo - 檢查更新的答案 – Fabio

+0

這很酷。其實我的問題是基於格式和屬性「派生」來自一個或多個其他屬性,因爲我認爲解決方案是相同的。但是這至少可以修復我的格式問題:-)。 – Noceo

相關問題