Создание данных времени разработки для приложения xaml

У меня есть приложение среды выполнения Windows Phone, и оно устало генерировать данные времени разработки с помощью Expression Blend. Проблема в том, что некоторые из моих классов являются вложенными классами, и данные проекта не будут компилироваться. Вот класс, который я использую для генерации данных времени разработки.

public class stats
{
    public class Pageviews
    {
        public int regular { get; set; }
        public int threat { get; set; }
        public int crawler { get; set; }
    }

    public class Uniques
    {
        public int regular { get; set; }
        public int threat { get; set; }
        public int crawler { get; set; }
    }

    public class TrafficBreakdown
    {
        public Pageviews pageviews { get; set; }
        public bool estimated { get; set; }
        public Uniques uniques { get; set; }
    }

    public class BandwidthServed
    {
        public double cloudflare { get; set; }
        public double user { get; set; }
    }

    public class RequestsServed
    {
        public int cloudflare { get; set; }
        public int user { get; set; }
    }

    public class Obj
    {
        public long cachedServerTime { get; set; }
        public long cachedExpryTime { get; set; }
        public TrafficBreakdown trafficBreakdown { get; set; }
        public BandwidthServed bandwidthServed { get; set; }
        public RequestsServed requestsServed { get; set; }
        public bool pro_zone { get; set; }
        public long currentServerTime { get; set; }
        public int interval { get; set; }
        public long zoneCDate { get; set; }
        public string userSecuritySetting { get; set; }
        public int dev_mode { get; set; }
        public int ipv46 { get; set; }
        public int ob { get; set; }
        public string cache_lvl { get; set; }
        public string outboundLinks { get; set; }
    }

    public class Result
    {
        public long timeZero { get; set; }
        public long timeEnd { get; set; }
        public int count { get; set; }
        public bool has_more { get; set; }
        public List<Obj> objs { get; set; }
    }

    public class Response
    {
        public Result result { get; set; }
    }

    public class RootObject
    {
        public Response response { get; set; }
        public string result { get; set; }
        public string msg { get; set; }
        public string err_code { get; set; }
    }
}

Вот файл .xaml времени разработки.

<ViewModels:MainViewModel.Stats>
    <Data:stats+Obj cache_lvl="Adipiscing nam phasellus" dev_mode="83" ipv46="75" interval="55" ob="47" outboundLinks="Parturient class aliquam vestibulum vestibulum" pro_zone="False" userSecuritySetting="Cras vestibulum curabitur">
        <Data:stats+Obj.bandwidthServed>
            <Data:stats+BandwidthServed cloudflare="500.26" user="349.37"/>
        </Data:stats+Obj.bandwidthServed>
        <Data:stats+Obj.cachedServerTime>
            <System:Int64/>
        </Data:stats+Obj.cachedServerTime>
        <Data:stats+Obj.cachedExpryTime>
            <System:Int64/>
        </Data:stats+Obj.cachedExpryTime>
        <Data:stats+Obj.currentServerTime>
            <System:Int64/>
        </Data:stats+Obj.currentServerTime>
        <Data:stats+Obj.requestsServed>
            <Data:stats+RequestsServed cloudflare="18" user="44"/>
        </Data:stats+Obj.requestsServed>
        <Data:stats+Obj.trafficBreakdown>
            <Data:stats+TrafficBreakdown estimated="True">
                <Data:stats+TrafficBreakdown.pageviews>
                    <Data:stats+Pageviews crawler="10" regular="41" threat="19"/>
                </Data:stats+TrafficBreakdown.pageviews>
                <Data:stats+TrafficBreakdown.uniques>
                    <Data:stats+Uniques crawler="99" regular="66" threat="39"/>
                </Data:stats+TrafficBreakdown.uniques>
            </Data:stats+TrafficBreakdown>
        </Data:stats+Obj.trafficBreakdown>
        <Data:stats+Obj.zoneCDate>
            <System:Int64/>
        </Data:stats+Obj.zoneCDate>
    </Data:stats+Obj>
</ViewModels:MainViewModel.Stats>

В нем говорится, что stats+.Obj недействителен в имени. У кого-нибудь есть решения?

Заранее спасибо.


person sidy3d    schedule 04.06.2014    source источник


Ответы (3)


Первая проблема, которую я вижу, заключается в том, что символ + недопустим в имени XML.

РЕДАКТИРОВАТЬ: используйте вкладку «Дизайн» в Blend для создания образца данных из вашего класса (просто нажмите «Создать образец данных из класса» на вкладке «Дизайн» и выберите свой корневой класс). Пример данных, которые я сгенерировал с помощью вашего класса:

<App7:Obj.bandwidthServed>
  <App7:BandwidthServed cloudflare="130.23" user="116.56"/>
</App7:Obj.bandwidthServed>
<App7:Obj.cachedServerTime>
  <System:Int64/>
</App7:Obj.cachedServerTime>
<App7:Obj.cachedExpryTime>
  <System:Int64/>
</App7:Obj.cachedExpryTime>
<App7:Obj.currentServerTime>
  <System:Int64/>
</App7:Obj.currentServerTime>
<App7:Obj.requestsServed>
  <App7:RequestsServed cloudflare="78" user="56"/>
</App7:Obj.requestsServed>
<App7:Obj.trafficBreakdown>
  <App7:TrafficBreakdown estimated="True">
    <App7:TrafficBreakdown.pageviews>
      <App7:Pageviews crawler="75" regular="13" threat="11"/>
    </App7:TrafficBreakdown.pageviews>
    <App7:TrafficBreakdown.uniques>
      <App7:Uniques crawler="19" regular="76" threat="32"/>
    </App7:TrafficBreakdown.uniques>
  </App7:TrafficBreakdown>
</App7:Obj.trafficBreakdown>
<App7:Obj.zoneCDate>
  <System:Int64/>
</App7:Obj.zoneCDate>
person Olivier Payen    schedule 05.06.2014
comment
Какой еще символ я могу использовать для доступа к вложенным классам. - person sidy3d; 06.06.2014

Почему бы вам просто не использовать Page DataContext и не создавать поддельные данные в своем конструкторе с помощью POCO, как показано ниже. Дизайнер VS 2103 отлично показывает данные во время разработки.

Вот XAML

<Page.DataContext>
    <ViewModel:BookVM />
</Page.DataContext>

Код позади

public class BookVM : ViewModelBase
{
    public BookVM()
    {
       if (IsInDesignMode)
       { 
          var books = new List<Book>();
          books.Add(new Book(){ Name = "Test"});
          books.Add(new Book(){ Name = "Test2"});
          books.Add(new Book(){ Name = "Test3"});

          Books = books;
      }
    }

    List<Person> _books;
    public List<Person> BookList
    {
        get{ return _books;}
        set
        {
           _books = value; 
            OnPropertyChanged();
        }
    }
} 

}

вот мой класс ViewModelBase

public class ViewModelBase : INotifyPropertyChanged
{
    public bool IsInDesignMode
    {
        get 
        {
            return DesignMode.DesignModeEnabled; 
        }
    }

    bool _isBusy;
    public bool IsBusy
    {
        get 
        {
            return _isBusy;
        }
        set 
        {
            _isBusy = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName]string propertyName="")
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}  
person Baski    schedule 05.06.2014
comment
Это было решение, которое я использовал раньше, думаю, я вернусь. - person sidy3d; 06.06.2014

Кажется, что когда ваше объявление класса находится внутри объявления другого класса (вложенного), механизм XAML не сможет правильно ссылаться на него. Объявление должно быть в корне пространства имен. я думаю это баг

person maeneak    schedule 18.03.2015