代码之家  ›  专栏  ›  技术社区  ›  Manal Goyal

WPF将用户控件属性绑定到UserControl XAML中的ViewModel

  •  -1
  • Manal Goyal  · 技术社区  · 7 年前

    我对WPF的开发非常陌生。我正在更新一个现有的应用程序,似乎实现了一个MVVM框架。 现在我有了一个用户控件(chartview.xaml),它具有依赖属性:

    public partial class ChartView : UserControl, IDisposable
    {
            public static readonly DependencyProperty SceneProperty = DependencyProperty.Register(
            "Scene",
            typeof(IScene),
            typeof(ChartView),
            new FrameworkPropertyMetadata(
                default(IScene),
                FrameworkPropertyMetadataOptions.AffectsRender,
                ChartChangedCallback));
    
            public IScene Scene
            {
                get => (IScene)GetValue(SceneProperty);
                set => SetValue(SceneProperty, value);
            }
    }
    

    我希望将此属性绑定到ViewModel,并且在的XAML中使用了以下代码 CARTVIEW 这样做:

    <local:ChartView
            x:Name="ChartView"
            Scene="{Binding Path=(viewModels:ChartViewModel.Scene)}"
            >
    

    但问题是,当我在“initializecomponent()”方法中得到stackOverflow异常时,此代码会循环调用用户控件上的构造函数。即使我从XAML中删除了场景绑定,也会出现异常。我一补充

    <local:ChartView>
    

    我开始得到堆栈溢出错误。

    有人能指出正确的方法吗?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Clemens    7 年前

    您将获得StackOverflowException,因为您正在其XAML中创建UserControl类的实例,例如

    <UserControl x:Class="YourNamespace:ChartView"
                 xmlns:local="clr-namespace:YourNamespace" ...>
        <local:ChartView .../>
    </UserControl>
    

    你显然不应该这样做。相反,在使用时,将用户控件的场景属性绑定到视图模型属性,例如在主窗口中:

    <Window ...>
        <Window.DataContext>
            <local:ChartViewModel/>
        </Window.DataContext>
        <Grid>
           <local:ChartView Scene="{Binding Scene}"/>
        </Grid> 
    </Window>
    

    还可以为用户控件(例如,在app.xaml中)创建设置绑定的默认样式:

    <Application.Resources>
        <Style TargetType="local:ChartView">
            <Setter Property="Scene" Value="{Binding Scene}"/>
        </Style>
    </Application.Resources>
    
    推荐文章