【问题标题】:Is it possible to access and set class variables from XAML in WPF application?是否可以在 WPF 应用程序中从 XAML 访问和设置类变量?
【发布时间】:2021-07-13 09:48:43
【问题描述】:

在 XAML 代码的一部分中,最大值和最小值设置如下:

<WindowsFormsHost>
    <wf:NumericUpDown  Maximum="12000" Minimum="120" x:Name="MyNumericUpDown" TextAlign="Right"/>
</WindowsFormsHost>

在同一个 C# 程序中,我有以下内容:

namespace MyNameSpace
{
    public class MyClass
    {
        public int max { get; } = 12000;
        public int min { get; } = 120;

        ...
    }
}

是否可以通过使用类属性而不是硬编码来设置 NumericUpDown 的最大值和最小值?因此,我更改类属性值时 XAML 值会自动更新。

【问题讨论】:

  • 是的,它叫做data binding
  • 你描述的是“单向”数据绑定
  • 您如何以及在何处实例化您的MyClass?在您的两个示例中,这些值都是硬编码的。

标签: c# wpf


【解决方案1】:

是的,这是可能的,甚至我认为是 WPF 开发的基础。它被称为data binding。我将在这里实现一个简单的单向数据绑定,它绑定到文件后面代码上的一个属性(即MainView.xaml 绑定到MainView.xaml.cs),但是你可以绑定到任何你想要的类,然后形成MVVM 的基本原理。

Xaml:

<Window x:Class="MainView"
    Title="MainView"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <!-- Snip -->
</Window>

重要的部分是DataContext="{Binding RelativeSource={RelativeSource Self}}。在这里,我们告诉窗口绑定到自身(即文件后面的代码)。这是任何工作都需要的。您可以使用this Q&A 了解如何绑定到其他内容。

继续:

<wf:NumericUpDown Maximum="{Binding Max}" Minimum="{Binding Min}" />

这里我们告诉NumericUpDown 组件从数据上下文中获取其MaximumMinimum 值。现在,需要注意的是,您只能 绑定到 properties,而不能绑定其他任何东西。因此,如果您遇到绑定无法正常工作的问题,请检查您是否绑定到某个属性。这是文件后面的代码

public class MainWindow
{
    public int Max { get; } = 12000;

    public int Min { get; } = 120;

    public MainWindow()
    {
        InitializeComponent();
    }
}

这是一种方式的数据绑定,即 XAML 只能读取这些值。对于输入框之类的东西,您需要使用TwoWay bindings。如果有任何改变这些值(目前不可能,但将来可能),那么你需要实现INotifyPropertyChanged


P.S:不保证代码。我只是在这个文本框中输入了它,没有任何自动完成功能,我最后一次使用 WPF 是很久以前的事了。如果有问题,请发表评论,我会尽力解决它

【讨论】:

  • 请注意,OP 已经有一个“视图模型”类。将 Window 实例用作 DataContext 没有任何意义。而应该是DataContext = myClass,myClass 是MyClass 的一个实例。
  • @Clemens 我们不知道MinMax 是在哪里声明的,因为MyNamespaceMyClass 显然是占位符,它们还不如在后面的代码中声明知道。如果不是,我链接到 StackOverflow 问答,它解释了如何将类设置为数据上下文,而不是文件背后的代码。
  • "在一个类中的同一个 C# 程序中,我有以下内容" - 它们显然是在 MyClass 中声明的,如问题所示。如果实际的类名可能不同,OP 可以很好地处理。
猜你喜欢
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2019-09-20
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多