我对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>
我开始收到堆栈溢出错误。
谁能指出正确的方法。
谢谢
答案 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>