簡體   English   中英

如何在WPF / MVVM中訪問子用戶控件的DependencyProperty?

[英]How to access a DependencyProperty of child user control in WPF/MVVM?

我有一個MainWindow.xaml ,如下所示:

<TabControl TabStripPlacement="Left">
    <TabItem Header="Display Tree Data Details" HorizontalAlignment="Left">
         <uControls:DisplayDataUserControl />
    </TabItem>

   <TabItem Header="Configuration" HorizontalAlignment="Left">
        ------
    </TabItem>
   <TabItem Header="About" HorizontalAlignment="Left">
        ------
    </TabItem>
   <TabItem Header="Sponsors" HorizontalAlignment="Left">
        ------
    </TabItem>
</TabControl>

我的DisplayDataUserControl使用另一個名為treeUserControl UserControl。 我制作了treeUserControl,以便可以在WPF應用程序中的任何位置重用它。

<UserControl x:Class="WpfApplication2.DisplayDataUserControl "
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         x:Name="thisUC"
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
     <local:treeUserControl />
     <Grid>
       <!-- display the details of the selected treeviewitem from "treeUserControl" here.  -->
     </Grid>
</Grid>
</UserControl>

treeUserControl是一個UserControl,它通過使用DependecyPropety( SelectedItem_ )擴展TreeView來顯示樹數據,如下所示:

<UserControl x:Class="WpfApplication2.treeUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         x:Name="thisUC"
         d:DesignHeight="300" d:DesignWidth="300">
<Grid>
    <local:ExtendedTreeView ItemsSource="{Binding Items}" 
                            SelectedItem_="{Binding MyTreeSelectedItem, Mode=TwoWay}">
         .....
    </local:ExtendedTreeView>
 </Grid>

DependencyProperty定義:

public class ExtendedTreeView : TreeView
{
    public ExtendedTreeView() : base()
    {
        this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(___ICH);
    }

    void ___ICH(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (SelectedItem != null)
        {
            SetValue(SelectedItem_Property, SelectedItem);
        }
    }

    public object SelectedItem_
    {
        get { return (object)GetValue(SelectedItem_Property); }
        set { SetValue(SelectedItem_Property, value); }
    }
    public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null));
}

我可以在DisplayDataUserControl訪問treeUserControl的MyTreeSelectedItem視圖模型屬性,以便它可以顯示有關所選樹視圖項目的詳細信息嗎?

您的綁定層次結構看起來不正確。

您現在看起來像什么

<TabControl>
    <TabItem>
        <TreeUserControl>
            <ExtendedTreeView ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" />
        </TreeUserControl>
    </TabItem>
    ...
</TabControl>

您應該擁有的是這樣的東西:

<TabControl ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}">
    <TabItem>                    <!-- DataContext is SelectedItem -->
        <TreeUserControl>        <!-- DataContext is SelectedItem -->
            <ExtendedTreeView /> <!-- DataContext is SelectedItem -->
        </TreeUserControl>
    </TabItem>
    ...
</TabControl>

在第二個例子中, .DataContext您的TabItem,TreeUserControl,並ExtendedTreeView將全部SelectedItem (這將是該項目的一個Items集合)的,因為這樣的DataContext的是默認情況下從父對象繼承

我知道您在ExtendedTreeView使用了Items ,而在TabControl使用了它,但是在不知道應用程序正確結構的情況下,我無法為您提供任何建議。 希望這可以使您知道自己在做什么錯,但是您可以糾正它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM