WPF - Доступ к статическому классу в другом пространстве имен - PullRequest
0 голосов
/ 23 октября 2019

У меня есть конфигурация для моего приложения в статическом классе:

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 для программы.

1 Ответ

1 голос
/ 23 октября 2019

Чтобы получить доступ к статическому члену класса (включая значения перечисления) в вашем XAML, используйте расширение разметки x: Static следующим образом: {x:Static nmspc:ClassName.MemberName} (или {x:Static nmspc:EnumTypeName.EnumValueName} -значения enum являются действительно статическими членами статического класса). Вы получаете префикс пространства имен, одно имя класса, необязательно предшествующее промежуточным пространствам имен 1 , и одно имя члена, и это все, что он делает. Если вам нужно свойство MemberName, сделайте статическую ссылку источником привязки. Привязка может иметь путь к свойству свойства:

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

1 Допустим, у вас есть nmspc = Foo, который содержит Bar пространства имен и класс MyClass в пространстве имен Foo.Bar.Baz. Это будет работать, но только в случае, когда Bar.Baz - это пространство имен, содержащееся в nmspc, а MyClass - это класс в Bar.Baz. Вы все еще получаете только один класс и один член.

{x:Static nmspc:Bar.Baz.MyClass.MemberName}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...