【问题标题】:wpf bind user control property to viewmodel in usercontrol xamlwpf将用户控件属性绑定到usercontrol xaml中的viewmodel
【发布时间】:2018-07-25 10:29:08
【问题描述】:

我对 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>

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

谁能指出正确的做法。

谢谢

【问题讨论】:

  • Path=(viewModels:ChartViewModel.Scene) 表示静态源属性。它应该只是 Path=Scene,前提是当前 DataContext 包含 ChartViewModel 的实例。对于 StackOverflowException,请参见此处:stackoverflow.com/a/48707786/1136211
  • @Clemens,我在这里尝试从同一个用户控件的 xaml 为我的用户控件设置属性绑定
  • 这不是您在问题中显示的内容。 &lt;local:ChartView ...&gt; 不是 ChartView 的 XAML。
  • 对不起,如果它误导了你,但它是 ChartView 的 xaml,我正在尝试在 ChartView.xaml 的 xaml 中添加绑定,并且我的属性存在于 ChartView.xaml.cs

标签: c# wpf xaml


【解决方案1】:

您收到 StackOverflowException 异常,因为您正在其 XAML 中创建 UserControl 类的实例,例如

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

你显然不应该那样做。相反,在使用时将 UserControl 的 Scene 属性绑定到视图模型属性,例如在您的主窗口中:

<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>

【讨论】:

  • 我看到它不可能像我试图做的那样做,我将在我的应用程序中添加更多的用户控件层来创建绑定,因为我没有访问权限到窗口课。我只是想知道天气是否可以在控件的父级内部进行。
  • @ManalGoyal 您可以使用样式来创建绑定。请参阅编辑后的答案。
  • 为什么在问题上是-1
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多