我有兩種看法:
- ShellView - DataContext。ShellViewModel
- VolumeViewerView - DataContext。VolumeViewerViewModel 。
ShellView是我程式中的根,它包含3個VolumeViewerView物件(使用其ViewModel實體)。
在每個背景關系中,事情都運行得非常順利,并且符合預期。
然而,在 VolumeViewerView 中,我有一個 <Image>,我想從 ShellViewModel 中控制其游標。
下面是代碼:
ShellView.xaml - MainView是VolumeViewerViewModel的一個實體。
<Frame Grid.Row="1"/span> Grid. Column="0" Grid. RowSpan="3" Content="{Binding MainView}"/>
ShellViewModel.cs
private Cursor _editorCursor;
public Cursor EditorCursor
{
get { return _editorCursor; }
set _editorCursor; }
{
_editorCursor = value;
NotifyOfPropertyChange(() => EditorCursor)。
}
}
VolumeViewerView.xaml
<Image [OTHER PROPERTIES]
Cursor="{Binding Path=DataContext.EditorCursor,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type local:ShellView}}"/>
當我把Cursor系結到VolumeViewerViewModel的一個屬性時,事情就像預期的那樣順利進行。但是在這里,它沒有連接。
我想知道,鑒于它們在不同的檔案中,這可能嗎?FindAncestor是否只在同一個xaml檔案的范圍內作業?
如果不可能,有什么好的替代方法?我可以在VolumeViewerViewModel中創建EditorCursor,并在ShellViewModel中的EditorCursor被設定時讓它被設定,但這看起來有點丑。如果這是唯一的方法,我可能就會選擇這樣做。
uj5u.com熱心網友回復:
正如 @Clemens 在評論中指出的,視覺樹以 Frame 元素結束。這是我問題的根源。我將子視圖放在一個Frame中,這意味著FindAncestor無法找到父元素及其DataContext。
我編輯了ShellView.xaml,替換了Frame:
<ContentControl Grid.Row="1"/span> Grid. Column="0" Grid. RowSpan="3" Content="{Binding MainView}"/>
這意味著我還必須編輯子視圖(它最初繼承了Page,它不能成為ContentControl的內容)。我把它變成了UserControl,并且系結作業如期進行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324490.html
標籤:
