如何获取子控件WPF的数据内容

本文关键字:WPF 数据 控件 何获取 获取 | 更新日期: 2023-09-27 18:29:42

在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>

在ParentVM中:

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。有没有办法获得这两个的数据上下文?

如何获取子控件WPF的数据内容

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

请考虑此代码。以下是视图模型:

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都从其父级"继承"DataContext(在这种特殊情况下,从父级Window继承)。

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

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}"

使用由上一个表达式指定的新数据上下文。

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