簡體   English   中英

如何修改依賴項屬性的setter值?

[英]How do I modify the setter value of a dependency property?

我有一個簡單的依賴屬性。 我有一個帶按鈕的用戶控件。 我希望調用者將名為MyName的屬性設置為“Hello”。 我希望依賴屬性代碼將字符串“World”追加到末尾。 這是我的代碼嘗試這個:

#region MyNAME DEPENDENCY PROPERTY
private string _myName;
public string MyName
{
    get { return this._myName; } //a breakpoint here never trips
    set
    {
        this._myName = value;
        this.OnPropertyChanged("MyName");
    }
}

public string MyName2 { get { return this._myName; } } //a breakpoint here will trip

public static readonly DependencyProperty MyNameProperty = DependencyProperty.Register("MyName", typeof(string), typeof(MyTabControl), new PropertyMetadata("", OnMyNamePropertyChanged));

private static void OnMyNamePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
    MyTabControl myUserControl = dependencyObject as MyTabControl;
    myUserControl.OnMyNamePropertyChanged(e);
    myUserControl.OnPropertyChanged("MyName");
}
private void OnMyNamePropertyChanged(DependencyPropertyChangedEventArgs e)
{
    this.MyName = (string)e.NewValue + " World";
}
#endregion //end MyNAME

我的按鈕XAML代碼如下所示:

<Button Content="{Binding Path=MyName, Mode=OneWay}" />

當我加載具有此控件的頁面時,如下所示:

<local:MyTabControl MyName="Hello" />

我得到一個顯示“Hello”的按鈕,而不是一個顯示“Hello World”的按鈕。 奇怪的是,如果我將我的按鈕XAML代碼更改為使用MyName2,如下所示:

<Button Content="{Binding Path=MyName2, Mode=OneWay}" />

有用。 getter代碼是相同的(我在上面包含它)。 我猜測得到_myName的代碼比我預期的更早被調用。 我也沒想到的是MyName getter似乎永遠不會被調用。 當我在那里設置斷點時,它不會跳閘。 當我更改按鈕綁定路徑以使用MyName2時,放在該getter上的斷點將跳閘。

我在這做錯了什么? 如何使用MyName屬性並讓我的按鈕顯示“Hello World”(當然不使用第二個getter)

編輯:添加新代碼。

我接受了你的兩個建議並將我的C#代碼更改為:

public string MyName
{
    get { return (string)GetValue(MyNameCustomProperty); }
    set { SetValue(MyNameCustomProperty, value + " World"); }
}
public static DependencyProperty MyNameCustomProperty = DependencyProperty.Register("MyName", typeof(string), typeof(MyTabControl));

(我仍然是新的依賴屬性)我仍然遇到與以前的代碼相同的問題。 我可以用這段代碼做點什么嗎?

這里的部分問題是你沒有使用真正的依賴屬性。 要使用依賴項屬性,您需要使用實際的依賴項屬性存儲而不是字段。 這種后備存儲是綁定等項目的值。 將代碼更改為以下內容並刪除支持字段

public string MyName
{
    get { return (string)this.GetValue(MyNameProperty); }
    set { this.SetValue(MyNameProperty, value); }
}

看起來我需要強迫價值。 我是這樣做的:

public string MyName
{
    get { return (string)GetValue(MyNameCustomProperty); }
    set { SetValue(MyNameCustomProperty, value); }
}
public static DependencyProperty MyNameCustomProperty = DependencyProperty.Register("MyName", typeof(string), typeof(MyTabControl), new PropertyMetadata("", MyPropertyChanged, CoerceCurrentReading));

private static void MyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    //contains coerced value
}

private static object CoerceCurrentReading(DependencyObject d, object value)
{
    MyTabControl tab = (MyTabControl)d;
    return (string)value + " World";
}

這看起來是將XAML代碼輸入的值從“Hello”更改為“Hello World”的最簡潔方法。

您希望更改通知發生前設置的值。 最簡單的解決方案是將支持字段的值設置為您想要的值,然后通知:

public string MyName
{
    get { return this._myName; } //a breakpoint here never trips
    set
    {
        this._myName = (string)value + "World!";
        this.OnPropertyChanged("MyName");
    }
}

您遇到的問題是您設置了支持字段。 然后通知,告訴UI更新,以及觸發OnNotifyPropertyChanged。 在屬性更改后調用OnNotifyPropertyChanged,您嘗試更改后備字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM