【问题标题】:WPF/C# Link Two Variables togetherWPF/C# 将两个变量链接在一起
【发布时间】:2017-12-13 19:39:16
【问题描述】:

我目前有一个简单的 WPF 应用程序,在 MainWindow 中我将有一个变量(在这种情况下,变量是一个保存数据的类)。然后我有一个具有相同变量的用户控件。 目前,我正在使用 ref 关键字传递变量,它工作得很好,但是,这是保存/好习惯吗?有没有更好的方法将这两个变量联系在一起?

我知道 DependencyProperty 的存在,但是我无法让它工作。

主窗口:

public partial class MainWindow : Window
{
    private TestClassWithInfo m_SelectedInfo;

    public MainWindow()
    {
        InitializeComponent();
        m_SelectedInfo = new DrawingInformation();
        TestGridUC mp = new TestGridUC(ref m_SelectedInfo);
        TestCanvas.Childrens.Add(mp);
    }
}

TestGridUI:

public partial class TestGridUC : UserControl {
        private TestClassWithInfo m_SelectedInfo;

        public TestGridUC (ref TestClassWithInfo e)
        {
            InitializeComponent();
            m_SelectedInfo = e;
        }
}

TestClassWithInfo:

public class TestClassWithInfo 
{
    public Image imageTest;
    public int intTest;


    public TestClassWithInfo ()
    {
        m_img = null;
        m_layer = 0;
    }
}

【问题讨论】:

  • 请注意,ref 关键字在这里毫无意义,它什么也不做。除此之外,您将 null 传递给 TestGridUC 构造函数,因为您仅在调用构造函数后才为 m_SelectedInfo 赋值。继续研究依赖属性。在 UserControl 类中声明一个,然后将其绑定到 MainWindow 的属性(或者更好地绑定到分配给 MainWindow 的 DataContext 的视图模型对象的属性)。但首先,请阅读 WPF 中的数据绑定和 MVVM。
  • 好的,谢谢,空引用实际上是输入问题时的输入错误,我首先创建了实例,然后将引用传递给它。
  • 你是工程师,做一个反叛者,但既然你在问......这绝对不是最好的方法。有人在下面标记了答案,但我将其标记为备份,因为如果您有兴趣使用 DependencyProperties(这很棒),那么我建议您按照建议花很短的时间学习它。如果没有更好的方法,如果您有兴趣,我们可以进一步讨论。

标签: c# wpf dependency-properties ref


【解决方案1】:

我知道 DependencyProperty 的存在,但是我无法让它工作。

依赖属性确实是解决它的方法:

public partial class TestGridUC : UserControl
{
    public TestGridUC()
    {
        InitializeComponent();
    }

    public TestClassWithInfo Info 
    {
        get { return (TestClassWithInfo)GetValue(InfoProperty); }
        set { SetValue(InfoProperty, value); }
    }

    public static readonly DependencyProperty InfoProperty =
        DependencyProperty.Register("Info", typeof(TestClassWithInfo), typeof(TestGridUC),
            new PropertyMetadata(null /*or initialize to a default of new TestClassWithInfo()*/ ));
}

现在您可以从 MainWindow 中的 xaml 绑定到该属性:

    <local:TestGridUC
        Info="{Binding Info}"></local:TestGridUC>

如果您需要这部分的帮助,正如 pr177 所回答的,有许多关于使用 MVVM 模式开始使用 WPF 的教程。这里的基础将涉及一个视图模型对象,该对象包含您绑定到的 TestClassWithInfo 公共属性。

【讨论】:

  • 谢谢,经过一些研究并阅读了 pr177 的链接。我得到了正确绑定的两个值。但是,在 xaml 中,绑定实际上最终看起来是 &lt;local:TestGridUC Info="{Binding m_SelectedInfo, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}"&gt;&lt;/local:TestGridUC&gt;,而没有 RelativeSource 它现在可以工作了!
  • @peti446 是的,如果您的主窗口不使用 ViewModel,则相对绑定将起作用。当项目开始变得复杂时,您将需要将包含信息对象的代码移动到 ViewModel 中。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 2015-10-18
  • 2023-03-19
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多