我有一個小應用程式,其中有一個模型樹,我希望根據雙擊的專案,不同的視圖應該出現在 ContentControl 中。 在此處輸入圖片說明
我創建了一個命令來更改 ContentControl 視圖,但問題是 TreeView 的 DataContext 是“TreeItemModel”,其中我擁有顯示樹和子項的所有資料,但命令和視圖處理在“ MainViewModel”,所以我無法選擇命令。 在此處輸入圖片說明
任何人都知道我該如何處理這個問題并能夠繼續使用我的 TreeItemModel 但 MainViewModel 來處理這個命令?
XAML 代碼:
<Grid Grid.Row="3" Background="#FFF0F0F0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30*" MaxWidth="350"/>
<ColumnDefinition Width="70*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0" Margin="5">
<TreeView x:Name ="TreeModel" ItemsSource="{Binding MainTree}" PreviewMouseDoubleClick="TreeView_PreviewMouseDoubleClick">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type model:TreeItemModel}" ItemsSource="{Binding Path=Elements}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.25*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="{Binding Path=Icon}" MaxHeight="30" MaxWidth="30" HorizontalAlignment="Left"/>
<TextBlock Grid.Column="1" Text="{Binding Path=Name}" Margin="5,0,0,0" HorizontalAlignment="Right" VerticalAlignment="Center"/>
</Grid>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="commandBehaviors:MouseDoubleClick.Command" Value="{Binding DoubleClickCmd}"/>
<Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter" Value="{Binding}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
</StackPanel>
<ContentControl Grid.Column="1"
Margin="10"
Content="{Binding CurrentView}"/>
</Grid>
主視圖模型代碼:
class MainViewModel
{
// Command when double clicking in tree item
public RelayCommand DoubleClickCmd { get; set; }
string ObjPath;
public List<TreeItemModel> MainTree { get; set; }
public TreeItemModel MainObject { get; set; }
public VariablesViewModel VariableVM { get; set; }
private object _currentView;
public object CurrentView
{
get { return _currentView; }
set
{
_currentView = value;
OnPropertyChanged();
}
}
public MainViewModel()
{
VariableVM = new VariablesViewModel();
// Command that i want ot execute
DoubleClickCmd = new RelayCommand(o =>
{
CurrentView = VariableVM;
});
}
}
uj5u.com熱心網友回復:
最簡單的方法是使用 RelativeSource 系結:
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="commandBehaviors:MouseDoubleClick.Command" Value="{Binding DataContext.DoubleClickCmd, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
<Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter" Value="{Binding .}"/>
</Style>
</TreeView.ItemContainerStyle>
解決它的另一種方法是使用 Proxy 類,它會將您的 DataContext 保持在變數中,例如 Proxy 看到這個:https : //code.4noobz.net/wpf-mvvm-proxy-binding/
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/399810.html
