簡體   English   中英

當我使用屬性更改將字符串綁定到XAML時,為什么沒有任何文本? C#Xamarin

[英]Why do I not get any text when I am binding a string to my XAML using a propertychanged? C# Xamarin

嘗試通過字符串將文本綁定到我的xaml並使用屬性更改的函數根據int的值更改文本。 這是我的代碼:

XAML:

<Label Text = "{Binding Forename}" />

碼:

public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged (string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null) {

            PropertyChanged (this, new PropertyChangedEventArgs (propertyName));    
        }

    }

    string info;
    int myInt = 0;

    public string Forename {

        get {
            return info;
        }
        set {
            if (myInt == 0) {
                info = value;
                OnPropertyChanged ("TextOne");
            }

            else if (myInt == 1)
            {
                OnPropertyChanged ("TextTwo");

            }
            else 
            {
                OnPropertyChanged ("TextThree");
            }
        }
    }

我現在沒有短信。

這不是OnPropertyChanged()工作方式。 您不應將要顯示的新文本作為參數傳遞,而應將新文本分配給info字段,並將屬性名稱作為參數。

OnPropertyChanged(name)作用是告訴XAML屬性name已更改,XAML將在該屬性name上獲取該屬性,並相應地更新顯示的值。

public string Forename {

    get {
        return info;
    }
    set {
        if (myInt == 0) {
            info = value;
            OnPropertyChanged ("Forename");
        }

        else if (myInt == 1)
        {
            info = "TextTwo";
            OnPropertyChanged ("Forename");

        }
        else 
        {
            info = "TextThree";
            OnPropertyChanged ("Forename");
        }
    }
}

編輯

當您對應放入protected virtual void OnPropertyChanged(string propertyName)疑問時,該函數就可以了。 調用它時,它將使用PropertyChangedEventHandler PropertyChanged使事件的所有子訂閱者都知道屬性propertyName已更改。 XAML {Binding Forename}充當PropertyChanged的訂閱者/偵聽者,並在得知其綁定的屬性(“ Forename”)已更改時將立即更新其文本。 當您調用OnPropertyChanged("Forename")時會發生什么。

編輯2似乎您可能忘記了在XAML的代碼背后分配DataContext(將被命名為mainwindow.xaml.cs之類的東西)

InitializeComponent();
ViewModel vm = new ViewModel();
DataContext = vm;
vm.Forename = "TestString"

並將Forename-code內容移到一個單獨的類中,命名為ViewModel。 像這樣:

public class ViewModel{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged (string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null) {
            PropertyChanged (this, new PropertyChangedEventArgs (propertyName));    
        }

    }

string info;
int myInt = 0;

public string Forename {

    get {
        return info;
    }
    set {
        if (myInt == 0) {
            info = value;
            OnPropertyChanged ("Forename");
        }

        else if (myInt == 1)
        {
            info = "TextTwo";
            OnPropertyChanged ("Forename");

        }
        else 
        {
            info = "TextThree";
            OnPropertyChanged ("Forename");
        }
    }
}
}

通過查看您的代碼,我懷疑您在Binding犯了最流行的錯誤。 沒有提出對正確屬性的更改。 想法是XAML必須以某種方式知道屬性已更改以更新UI-因此,請以緊密循環的方式運行,並檢查屏幕上的屬性值是否與此不同,Microsoft附帶了名為PropertyChangeddelegate想法。 主要用於吸氣劑/裝夾劑。

使用此委托時必須非常小心,因為在委托的.NET Framework版本4之前, string -屬性名稱 更高版本的.NET Framework帶有特殊屬性CallerMemberName-例如: Jesse Liberty

在這種情況下,您將引發屬性更改事件,但是在參數中,您發送的屬性名稱不存在:(您應該僅發送OnPropertyChanged("Forename")

暫無
暫無

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

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