WPF自定义控件的依赖属性绑定viewmodel不起作用(已解决:附解决方案!)

public FunTurnValToolBox()
        {
            InitializeComponent();
            this.DataContext = this;
            TurnValCommand = new DelegateCommand<string>(s => {
                if (s == "UP")
                {
                    if (TurnValue < TurnMaxValue)
                        TurnValue += 1;
                }
                else
                {
                    if (TurnValue > TurnMinValue)
                    {
                        TurnValue -= 1;
                    }
                }
            });
        }

 public static readonly DependencyProperty TurnValueProperty = DependencyProperty.Register("TurnValue", typeof(int), typeof(FunTurnValToolBox), new FrameworkPropertyMetadata()
        {
            PropertyChangedCallback = OnDemoChanged,
            BindsTwoWayByDefault = true
        });
        public int TurnValue
        {
            get
            {
                return (int)GetValue(TurnValueProperty);
            }
            set
            {
                SetValue(TurnValueProperty,value);
            }

        }

        private static void OnDemoChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (e.OldValue != e.NewValue)
            {
                //逻辑处理
            }
        }


        



        public static DependencyProperty TurnMaxValueProperty = DependencyProperty.Register("TurnMaxValue", typeof(int), typeof(FunTurnValToolBox), new FrameworkPropertyMetadata(100)
        {
            PropertyChangedCallback = OnDemoChanged,
            BindsTwoWayByDefault = true
        });
        public int TurnMaxValue
        {
            get
            {
                return (int)GetValue(TurnMaxValueProperty);
            }
            set
            {
                SetValue(TurnMaxValueProperty, value);
            }
        }


        public static DependencyProperty TurnMinValueProperty = DependencyProperty.Register("TurnMinValue", typeof(int), typeof(FunTurnValToolBox), new FrameworkPropertyMetadata(0)
        {
            PropertyChangedCallback = OnDemoChanged,
            BindsTwoWayByDefault = true
        });

        

        
        public int TurnMinValue
        {
            get
            {
                return (int)GetValue(TurnMinValueProperty);
            }
            set
            {
                SetValue(TurnMinValueProperty, value);
            }
        }

下面是另一个UserControl中的应用(部分代码),此时已经设置了UserControl的DataContext为自己定义的ViewModel,并且自定义的ViewModel已经实现了INotifyPropertyChanged接口。

<Grid Margin="0,0,0,10">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid Grid.Column="0">
                    <TextBlock Text="行高" FontSize="14" Foreground="{StaticResource Normal.FontColor}" VerticalAlignment="Center" Padding="5" />
                </Grid>
                <Grid Grid.Column="1">
                    <local:FunTurnValToolBox TurnValue="{Binding FontLineHeight,Mode=TwoWay}" TurnMinValue="0" TurnMaxValue="80"  Width="Auto" Height="Auto" x:Name="FTVB" />
                </Grid>
            </Grid>

问题:自定义的控件的依赖属性再绑定viewmodel的属性时无法生效,这是什么问题,求大神指教!

今天进行补充更新,问题已经得到解决!解决方案如下:

1.将引入的viewmodle设置成DataContext之后,加上名称(例如 x:Name=“TPB”)

<UserControl.DataContext>
        <local:TextPropertyToolBoxModel x:Name="TPB" />
</UserControl.DataContext>

2.将自定义控件(FunTurnValToolBox)的依赖属性(TurnValue)通过如下方式进行绑定即可

<local:FunTurnValToolBox TurnValue="{Binding ElementName=TPB,Path=FontLineHeight,Mode=TwoWay}" TurnMinValue="0" TurnMaxValue="80"  Width="Auto" Height="Auto" x:Name="LineHeightBox" />

3.补充:其他博客主说的修改自定义控件的依赖属性默认的 BindingMode为TwoWay其实没有任何关系,如下所示定义依赖属性依旧可以成功

public static readonly DependencyProperty TurnValueProperty = DependencyProperty.Register("TurnValue", typeof(int), typeof(FunTurnValToolBox));
        public int TurnValue
        {
            get
            {
                return (int)GetValue(TurnValueProperty);
            }
            set
            {
                SetValue(TurnValueProperty,value);
            }

        }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值