[英]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
。 文本框綁定到Comment
的Text
屬性。 該注釋可能不存在。
<TabControl DataContext="{Binding InstanceOfEntry}">
<!-- ... -->
<TextBox Text="{Binding Comment.Text, UpdateSourceTrigger=PropertyChanged}"/>
<!-- ... -->
</TabControl>
什么不起作用:
Comment.Text
)中的string
上起作用,而不在Comment
本身上起作用。 Path
拆分為其各個組件,並將Comment
部分設置為周圍元素的DataContext。 當數據庫不包含Entry
時,可以使用轉換器使用后備注釋。 但是我不知道注釋一旦更改,如何將其附加到Entry
。 我的ConvertBack
從來沒有被調用過(考慮它,我不知道為什么要這么做……)。 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.