【问题标题】:WPF - Access static class in different NamespaceWPF - 访问不同命名空间中的静态类
【发布时间】:2019-10-23 14:16:34
【问题描述】:

我在静态类中有我的应用程序的配置:

namespace Program.Config
{
  static Class AppConfig
  {
    ...
  } 
}

现在,我想在我的xaml 中访问此配置。

所以,我添加了

xmlns:config="clr-namespace:Program.Config"

我的观点是Program.Views

但是,访问AppConfig 就像

config:AppConfig.ConnectionConfig.conParam.ethPort

不工作。

从 WPF 中的不同命名空间访问静态类成员的正确方法是什么?

编辑:

好的,MWE 来了:

MainWindow.xaml.cs:

using System.Threading;
using System.Windows;
using Program.ViewModels;

namespace Program
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            MainVM vm = new MainVM();
            DataContext = vm;
            InitializeComponent();
        }
    }
}

`MainVM.cs

using Prism.Mvvm;
using System;

namespace Program.ViewModels
{
    internal class MainVM : BindableBase
    {
        public MainVM()
        {

        }

    }
}

`MainWindow.xaml

<Window x:Class="Program.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:config="clr-namespace:Program.Config"
        mc:Ignorable="d"
        Title="MainWindow" Height="700" Width="1000">


    <DockPanel LastChildFill="False">
        <Label Content="Port is:" />
        <Label Content="{Binding config:AppConfig.ConnectionConfig.conParam.ethPort}" />
    </DockPanel>
</Window>

Config.cs:

namespace Program
{
    using Program.Config;

    public struct ConnectionParameters
    {
        public int ethPort { get; set; }
        public string ethIp { get; set; }
    }

    public static class AppConfig
    {
        public static ConnectionConfObj ConnectionConfig { get; set; }

        static AppConfig()
        {
            ConnectionConfig = new ConnectionConfObj();
        }
    }
}

namespace Program.Config
{
    public abstract class ConfigBase
    {
        public string filepath { get; set; }
    }

    public class ConnectionConfObj : ConfigBase
    {
        public ConnectionParameters conParam { get; set; }

        public ConnectionConfObj()
        {
            ConnectionParameters _conParam = new ConnectionParameters();
            _conParam.ethPort = 8;

            conParam = _conParam;
        }
    }

}

在程序的范围内,配置的结构是这样的,因为我从不同的来源读取了多个配置,并希望将它们呈现在程序的一个 AppConfig 中。

【问题讨论】:

  • Program 在这里以两种不同的方式拼写是否相关?
  • 啊,不抱歉,只是一个错字。该程序实际上有一个不同的名称,我只是在这里编辑了它。
  • 那么一个可重现的例子怎么样? NetworkConfig 和 NetworkConfig.IP 是如何定义的?你在 XAML 中使用x:Static 吗?如果 AppConfig 是一个类,x:Static 可以引用该类的成员,仅此而已。不是会员的会员。如果 AppConfig 是 Program.Config 中包含的命名空间,而 NetworkConfig 是该命名空间中的一个类,而 IP 是该 NetworkConfig 类的静态成员,则可以使用。但我猜它是成员的成员。
  • {Binding ID, Source={x:Static config:AppConfig.NetworkConfig}} 可能是答案,但您提供的信息太少,无法确定。
  • 添加了 MWE,抱歉我没有马上添加。

标签: wpf static namespaces


【解决方案1】:

要访问 XAML 中的静态类成员(包括枚举值),请使用 x:Static markup extension,如下所示:{x:Static nmspc:ClassName.MemberName}(或 {x:Static nmspc:EnumTypeName.EnumValueName}——枚举值实际上是静态类的静态成员) .您将获得一个命名空间前缀、一个可选地以中间命名空间开头的类名和一个成员名,仅此而已。如果您需要MemberName 的属性,请将静态引用设置为绑定的源。一个 Binding 可以有一个属性的路径:

<Label 
    Content="{Binding conParam.ethPort, Source={x:Static config:AppConfig.ConnectionConfig)}" 
    />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2022-01-13
    • 2012-06-23
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多