gpt4 book ai didi

c# - 如何获取子控件 WPF 的 Datacontext

转载 作者:行者123 更新时间:2023-11-30 21:52:29 24 4
gpt4 key购买 nike

在 App.xaml 中

<DataTemplate DataType="{x:Type vm:CurrentSheetVM}">
<vw:CurrentSheetV/>
</DataTemplate>

<DataTemplate DataType="{x:Type vm:ParentVM}">
<vw:ParentControlV/>
</DataTemplate>

在 XAML 中:

 <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" > 
<ContentControl Name="childCtrl1" Content="{Binding CurrentSheet1}"/>
<ContentControl Name="childCtrl2" Content="{Binding CurrentSheet2}"/>
</StackPanel>

在父虚拟机中:

private ViewModelBase currentSheet1;
public ViewModelBase CurrentSheet1
{
get { return currentSheet1; }
set { currentSheet = value;
this.OnPropertyChanged("CurrentSheet1");
}
}

public ParentVM()
{
CurrentSheet1= new CurrentSheetVM(some param1);
CurrentSheet2= new CurrentSheetVM(some param2);
}

在代码后面

Object dc_Child1= childCtrl1.DataContext;
Object dc_Child2= childCtrl2.DataContext;

这里我试图获取两个子控件的数据上下文,但它在 dc_Child1 和 dc_Child2 中显示父数据上下文。有没有办法获取这两个的datacontext?

最佳答案

问题在于设置 ContentControl.Content 与设置 ContentControl.DataContext 不同。

考虑这段代码。以下是 View 模型:

public class ParentViewModel
{
public ChildViewModel_A Child_A { get; } = new ChildViewModel_A
{
IntProperty = 100
};

public ChildViewModel_B Child_B { get; } = new ChildViewModel_B
{
StringProperty = "Hello, world!"
};
}

public class ChildViewModel_A
{
public int IntProperty { get; set; }
}

public class ChildViewModel_B
{
public string StringProperty { get; set; }
}

这是标记:

<Window x:Class="DataContextsDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataContextsDemo">

<Window.DataContext>
<local:ParentViewModel />
</Window.DataContext>

<StackPanel>
<StackPanel.Resources>
<DataTemplate DataType="{x:Type local:ChildViewModel_A}">
<TextBlock Text="{Binding IntProperty}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:ChildViewModel_B}">
<TextBlock Text="{Binding StringProperty}"/>
</DataTemplate>
</StackPanel.Resources>

<ContentControl x:Name="Child_A_View" Content="{Binding Child_A}"/>
<ContentControl x:Name="Child_B_View" Content="{Binding Child_B}"/>
<Button Content="Click me!" Click="Button_Click"/>
</StackPanel>
</Window>

默认情况下,ContentControl 都从它们的父级(在这种特殊情况下,从祖父级 Window)“继承”DataContext

如果你要点击按钮,这段代码在后面的代码中:

private void Button_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine(Child_A_View.DataContext == Child_B_View.DataContext);
}

会将 True 写入输出窗口,因为两个控件的数据上下文都是 ParentViewModel 的实例。

但是如果XAML会稍微修改成这样:

    <ContentControl x:Name="Child_A_View" DataContext="{Binding Child_A}" Content="{Binding}"/>
<ContentControl x:Name="Child_B_View" DataContext="{Binding Child_B}" Content="{Binding}"/>

Debug.WriteLine 将写入 False,因为这会显式设置 DataContext 并破坏默认的“继承”策略。请注意,这个表达式:

DataContext="{Binding Child_A}"

仍然与父 DataContext 一起工作,而这个:

Content="{Binding}"

使用由先前表达式分配的新数据上下文。

另请注意,此示例中内容控件的内容将保持不变。唯一改变的是数据上下文。

关于c# - 如何获取子控件 WPF 的 Datacontext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715383/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com