簡體   English   中英

無法成功將ViewModel數據公開給View以進行XAML綁定

[英]Failing to successfully expose my ViewModel data to my View for XAML binding

我正在構建Windows Universal應用,並嘗試將ViewModel中的數據公開到View,以便可以將其綁定到XAML元素。 至此,我已經完全注釋掉了我所有的代碼,而只是編寫測試代碼行以嘗試使其正常工作,這就是下面的示例。 直接從View綁定(如果我在其中創建對象作為測試)確實可以。

請幫助我了解問題出在哪里,我想我已經閱讀了互聯網上的所有綁定教程,但仍然不明白。

查看( MainPage.xaml.cs ):

public MainPage()
{   
    InitializeComponent();
    DataContext = new MainViewModel();

}

ViewModel( MainViewModel.cs ):

public class MainViewModel
{
    public Term newTerm = new Term
    {
        TermName = "Table",
        TermDescription = "You eat dinner on it"    
    };
}

XAML( MainPage.xaml ):

<StackPanel DataContext="{Binding newTerm}" x:Name="mvvmStack" Orientation="Vertical">
    <TextBlock x:Name="mvvmTermName" Text="{Binding TermName,  FallbackValue='Fallingback'}" />
    <TextBlock x:Name="mvvmDescription" Text="{Binding TermDescription, FallbackValue='Fallingback', TargetNullValue='Unknown'}" />
</StackPanel>

我得到的錯誤是:

Error: BindingExpression path error: 'newTerm' property not found on ''. BindingExpression: Path='newTerm' DataItem=''; target element is 'Windows.UI.Xaml.Controls.StackPanel' (Name='mvvmStack'); target property is 'DataContext' (type 'Object')

我已經讀過有關這種類型的錯誤的信息,盡管我對它要說的內容有所了解,但無法解決該錯誤。 我是一個非常完整的編碼初學者,尤其是C#,因此在回答:-)時請考慮到這一點。

只需嘗試將其從字段更改為屬性,它將可以正常工作。 您無法綁定到字段。 編輯:

private Term _term;
public Term NewTerm{
    get{return _term;}
    set
    {
       _term= value;
       OnPropertyChanged("Term");
    }
}

如果需要在viewmodel中添加通知視圖的更改,則需要實現INotifyPropertyChanged。 檢查此答案,將提供屬性更改的示例。 https://stackoverflow.com/a/27685925/1448382

如果要將視圖綁定到子屬性,則根據情況有兩個選擇:

1-相對綁定:當您不從ViewModel修改Term對象內的屬性時,即在您將它們在視圖模型中被初始化並可以在視圖中進行修改的情況下,就可以使用此方案。 Plesae注意,您需要綁定的任何內容都應該是屬性,而不是字段。

2-直接綁定到Viewmodel:當您在加載視圖后從Viewmodel修改Term對象內的屬性時,將使用此方案。 這樣,您將需要向TermName和TermDescription屬性的視圖模型添加屬性。

public string TermName{
    get{return NewTerm.Name;}
    set{NewTerm.Name = value;
        OnPropertyChanged("TermName");
    }//The same is applied for TermDescription

但是請注意,由於您直接在Viewmodel中定義了屬性,因此需要刪除Stackpanel對象上的綁定。

嘗試這樣的事情:

<Page.Resources>
    <viewModels:MainViewModel x:Key="MainViewModel" />
</Page.Resources>

接着:

<StackPanel x:Name="mvvmStack" Orientation="Vertical">
            <TextBlock x:Name="mvvmTermName" Text="{Binding newTerm.TermName, Source={StaticResource MainViewModel}  FallbackValue='Fallingback'}" />
            <TextBlock x:Name="mvvmDescription" Text="{Binding newTerm.TermDescription, Source={StaticResource MainViewModel} FallbackValue='Fallingback', TargetNullValue='Unknown'}" /></StackPanel>

五言的newTerm應與INotifyChanged的財產

暫無
暫無

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

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