WPF 自定义控件无法找到DataContext

问题是这样的:

   我自定义了一个可以反转的两种状态的控件,资源文件如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:MusicMian"
                    >
    <Style TargetType="{x:Type local:NativeContainer}">
        <Setter Property="IsTabStop" Value="False"></Setter>
        <Setter Property="Focusable" Value="False"></Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:NativeContainer}">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup Name="ViewStates">
                                <VisualState Name="ContentView">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="TooltipBorder"
                                                          Storyboard.TargetProperty="Opacity" Duration="0" To="0"
                                                         />
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="TootipView">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="ContentBorder"
                                                         Storyboard.TargetProperty="Opacity" Duration="0" To="0"
                                                         />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Border Name="ContentBorder">
                            <ContentPresenter VerticalAlignment="Stretch" 
                                              DataContext="{TemplateBinding DataContext}"
                                              HorizontalAlignment="Stretch" Content="{TemplateBinding ContentView}"></ContentPresenter>
                        </Border>
                        <Border Name="TooltipBorder">
                            <ContentPresenter VerticalAlignment="Stretch"
                                              DataContext="{TemplateBinding DataContext}"
                                              HorizontalAlignment="Stretch" Content="{TemplateBinding TooltipView}"></ContentPresenter>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
功能代码如下:
public class NativeContainer : Control
    {
        static NativeContainer()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(NativeContainer),new FrameworkPropertyMetadata(typeof(NativeContainer)));
            IsFilpedProperty = DependencyProperty.Register("IsFilped",typeof(bool),typeof(NativeContainer),new FrameworkPropertyMetadata(false,new PropertyChangedCallback(IsFilpedChanged)));
            ContentViewProperty = DependencyProperty.Register("ContentView",typeof(object),typeof(NativeContainer));
            TooltipViewProperty = DependencyProperty.Register("TooltipView", typeof(object), typeof(NativeContainer));
        }
        private static void IsFilpedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            NativeContainer NC = (NativeContainer)d;
            NC.ChangedVisualState(false);
        }
        private void ChangedVisualState(bool p)
        {
            if (IsFilped)
            {
                VisualStateManager.GoToState(this, "ContentView", p);
            }
            else 
            {
                VisualStateManager.GoToState(this, "TootipView",p);
            }
            UIElement CView = ContentView as UIElement;
            if (CView != null)
            {
                if (IsFilped)
                {
                    CView.Visibility = Visibility.Visible;
                }
                else 
                {
                    CView.Visibility = Visibility.Hidden;
                }
            }
            UIElement TView = TooltipView as UIElement;
            if (TView != null)
            {
                if (IsFilped)
                {
                    TView.Visibility = Visibility.Hidden;
                }
                else 
                {
                    TView.Visibility = Visibility.Visible;
                }
            }
        }
        public static readonly DependencyProperty IsFilpedProperty;
        public static readonly DependencyProperty ContentViewProperty;
        public static readonly DependencyProperty TooltipViewProperty;
        public bool IsFilped
        {
            get { return (bool)GetValue(IsFilpedProperty); }
            set { SetValue(IsFilpedProperty, value); }
        }
        public object ContentView
        {
            get { return (object)GetValue(ContentViewProperty); }
            set { SetValue(ContentViewProperty, value); }
        }
        public object TooltipView
        {
            get { return (object)GetValue(TooltipViewProperty); }
            set { SetValue(TooltipViewProperty, value); }
        }
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            ChangedVisualState(false);
        }
    }
代码很简单,不做解释。

我现在遇到的问题是:我将两个这种自定义控件放到TabControl的两个TabItem中,同样的数据源绑定方法(自定义控件中的ContentView),第一个可以绑定到数据,第二个绑定不到数据。哪位大侠可以帮我解决这个问题,表示感谢。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WPF MVVM模式中,可以通过在ViewModel中使用ObservableCollection来动态添加自定义控件。ObservableCollection是.NET Framework提供的一个集合类,它能够在集合元素发生变化时自动通知界面进行更新。 首先,在ViewModel中声明一个ObservableCollection属性,用于存储自定义控件的集合。然后,在需要添加自定义控件的地方,通过操作ObservableCollection来添加新的控件。ViewModel会自动通知界面进行更新。 接下来,界面需要绑定这个ObservableCollection属性,并使用数据模板来定义如何渲染每个自定义控件。在XAML中,可以使用ItemsControl或者ListBox等控件来展示这个集合,并通过绑定将集合和数据模板关联起来。 在这个过程中,可以根据需要使用拖放、缩放、旋转等功能。可以参考中的示例代码,了解如何实现这些功能。 最后,通过实例化ViewModel,并将其赋值给界面的DataContext属性,从而建立ViewModel和View之间的关联。可以参考中的代码。 总结起来,实现在WPF MVVM模式中动态添加自定义控件的步骤为: 1. 在ViewModel中声明一个ObservableCollection属性,用于存储自定义控件的集合; 2. 在需要添加自定义控件的地方,通过操作ObservableCollection来添加新的控件; 3. 在界面中,绑定这个ObservableCollection属性,并使用数据模板来定义如何渲染每个自定义控件; 4. 根据需要使用拖放、缩放、旋转等功能; 5. 实例化ViewModel,并将其赋值给界面的DataContext属性,建立ViewModel和View之间的关联。 希望这个实现思路对你有帮助,如果需要更详细的代码示例,可以参考中的文章。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [用WPF mvvm如何动态添加自定义控件问题](https://blog.csdn.net/netyou/article/details/104371498)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [WPF Prism MVVM【动态添加控件并可用鼠标、拖动、缩放、旋转】](https://blog.csdn.net/redfox6843/article/details/126117819)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值