wpf将用户控件属性绑定到usercontrol xaml

时间:2018-07-25 10:29:08

标签: c# wpf xaml

我对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,并且在 ChartView.xaml 的Xaml中使用以下代码来实现此目的:

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

但是问题是,当我在“ InitializeComponent()”方法中获得stackOverflow异常时,此代码将反复在用户控件上调用构造函数。即使我从xaml中删除了场景绑定,也存在异常。我添加

<local:ChartView>

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

谁能指出正确的方法。

谢谢

1 个答案:

答案 0 :(得分:0)

因为在UserControl类的XAML中创建其实例,所以得到了StackOverflowException,例如

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

您显然不应该这样做。而是在使用时将UserControl的Scene属性绑定到视图模型属性,例如在您的MainWindow中:

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

您还可以为UserControl创建默认样式(例如,在App.xaml中),以设置绑定:

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