簡體   English   中英

綁定到XAML中的嵌套屬性的后備

[英]Fallback for binding to a nested property in XAML

我使用WPF來顯示和編輯由實體框架管理的數據庫。 隨着數據庫的發展,我類的某些屬性實際上是對其他表的引用,其中一些是可選的。

現在,我仍然想顯示一個文本框(或更合適的控件),用戶可以在其中編輯此類嵌套屬性的內容,並在數據綁定將其寫入源時即時創建它。

例如:

class Entry
{
    // ...
    public virtual Comment MyComment {get;set;} // Raises PropertyChangedEvent
}

class Comment
{
    // ...
    public string Text {get;set;} // Raises PropertyChangedEvent
}

在XAML中,周圍的DataContext設置為數據庫中的現有Entry 文本框綁定到CommentText屬性。 該注釋可能不存在。

<TabControl DataContext="{Binding InstanceOfEntry}">
    <!-- ... -->
    <TextBox Text="{Binding Comment.Text, UpdateSourceTrigger=PropertyChanged}"/>
    <!-- ... -->
</TabControl>

什么不起作用:

  • FallbackValueTargetNull :它們在我的示例( Comment.Text )中的string上起作用,而不在Comment本身上起作用。
  • MultiBinding :我試圖將數據綁定Path拆分為其各個組件,並將Comment部分設置為周圍元素的DataContext。 當數據庫不包含Entry時,可以使用轉換器使用后備注釋。 但是我不知道注釋一旦更改,如何將其附加到Entry 我的ConvertBack從來沒有被調用過(考慮它,我不知道為什么要這么做……)。
  • PriorityBinding :與我的多重綁定嘗試一樣,它可以與虛擬Comment一起使用,但不會從DataContext寫入到Entry

TL / DR:有沒有一種方法可以觸發在綁定路徑中創建對象?

    Entry.null.string

    string is edited using data binding
    *xaml magic happens*

--> Entry.Comment.string

好吧,這僅是我自己問題的答案。 我仍在尋找“ xaml方法”。

我現在要做的是在視圖模型中重建數據結構的某些部分。

class ViewModel
{
    public Entry MyEntry {get;set;}

    public Comment CurrentComment
    {
        get
        {
            if (MyEntry.Comment != null)
                return MyEntry.Comment;

            var c = new Comment();
            c.PropertyChanged += CommentChanged;
            return c;
        }
    }
}

另外,還不只是返回新的Comment :我使用處理程序訂閱了它的PropertyChanged事件,該處理程序在每次修改時將其重新附加到MyEntry實例。

void CommentChanged(object sender, PropertyChangedEventArgs e)
{
    MyEntry.Comment = sender as Comment;
}

這聽起來很丑陋(實際上更糟糕,因為我必須過濾驗證屬性等),因此仍然希望有更好的方法。

暫無
暫無

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

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