2013-03-04 2 views
-1

У меня есть простая проблема, и я уверен, что кто-то может мне помочь. Как я могу использовать переменную accountID в методах INavigationAware, а затем использовать их в другом классе?Используйте переменную в ViewModel

Ниже мой код:

ViewModel Соответствующий код (HistoryAuditLogViewModel.cs):

#region Private Fields 

private DatabaseConnectionSetting dbSetting; 
private string tableName = "Manufacturers"; 
private int primaryKeyID = 1; 
private string entryID; 
private string manufacturerID; 
private string manufacturerName; 
private string auditDate; 
private string sqlLogin; 
private string application; 
private List<string> dataList; 
private string dbConnectionKey = Alliance.Infrastructure.Common.DatabaseConnectionSetting.BACKFLOW_SCOPE_KEY; 
private int ShowAuditLogForPrimaryID { get; set; } 
private int initialAuditID; 
private int _accountID; 

private string xmlString() 
{ 
    return "<row EntryID=\"" + entryID + "\" ManufacturerID=\"" + manufacturerID + "\" ManufacturerName=\"" + manufacturerName + "\" AuditDate=\"" + auditDate + "\" SqlLogin=\"" + sqlLogin + "\" Application=\"" + application + "\" />"; 
} 

private DataSet _dataSet; 

#endregion 

#region Public Fields 

public DataSet dataSet 
{ 
    get { return _dataSet; } 
    set { _dataSet = value; } 
} 

public int accountID 
{ 
    get { return _accountID; } 
    set { _accountID = value; } 
} 

#endregion 

#region INavigationAware Members 

     bool INavigationAware.IsNavigationTarget(NavigationContext navigationContext) 
     { 
      string tableName; 
      string holdStringValue; 

      holdStringValue = navigationContext.Parameters["primarykey"]; 
      if (holdStringValue == null || 
       !Int32.TryParse(holdStringValue, out accountID)) 
      { 
       accountID = 0; 
      } 

      if (accountID == this.ShowAuditLogForPrimaryID) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     void INavigationAware.OnNavigatedFrom(NavigationContext navigationContext) 
     { 
     } 

     void INavigationAware.OnNavigatedTo(NavigationContext navigationContext) 
     { 
      string holdStringValue; 
      int accountID; 
      initialAuditID = 0; 

      holdStringValue = navigationContext.Parameters["TableName"]; 
      if (holdStringValue == null || 
       !Int32.TryParse(holdStringValue, out initialAuditID)) 
      { 
       initialAuditID = 0; 
      } 

      holdStringValue = navigationContext.Parameters["AccountID"]; 
      if (holdStringValue != null && 
       Int32.TryParse(holdStringValue, out accountID)) 
      { 
       this.ShowAuditLogForPrimaryID = accountID; 
      } 
      else 
      { 
       this.ShowAuditLogForPrimaryID = 0; 
      } 

      Load_Audit(); 
     } 

     #endregion INavigationAware Members 

Я собираюсь нужно использовать и имя accountID таблицы, которая устанавливается в этих методах. По крайней мере, я думаю, что именно там они устанавливаются. Я никогда не использовал INavigation, поэтому я немного смущен тем, как это работает.

Вот где мне нужно, чтобы иметь возможность использовать переменную из ViewModel (CoreModuleDesktop):

this.NavManager.RegisterCommonActionItem("History Audit Log", "AuditLog", 110, 
       new BitmapImage(new Uri("pack://application:,,,/Core;component/Resources/maintenance.png")), 
        new Action(() => 
        { 
         IRegionManager regionManager = AllianceApp.Container.GetExportedValue<IRegionManager>(); 
         UriQuery query = new UriQuery(); 

         query.Add("AccountID", accountID.ToString()); 
         //query.Add("ServiceOrderID", tableName.ToString()); 

         regionManager.RequestNavigate(RegionNames.MainRegion, new Uri(typeof(HistoryAuditLogView).FullName + query.ToString(), UriKind.Relative)); 
         })); 
        } 

В основном то, что это происходит, чтобы позволить мне сделать это запустить запрос в ViewModel, который помещает результаты запроса в виде сетки данных. Любая помощь будет оценена.

+0

«Релевантный код» не имеет отношения к делу. Каковы переменные «accountID» и «имя таблицы»? Являются ли они глобальными переменными? В коде, который вы публикуете из «CoreModuleDesktop», нет НИКАКОГО КОНТЕКСТА. Это в одном классе? Разный класс? другой проект? Вы также забыли задать вопрос. Пожалуйста, переформатируйте свой пост, чтобы быть более кратким и понятным о том, что вы пытаетесь сделать, и о том, что у вас возникают проблемы. – tnw

+0

Прошу прощения. Я обновил вопрос. – JLott

ответ

0

O_o ​​Хорошо, мой ответ был удален администратором. Я не уверен, почему, но я думаю, что сейчас у меня проблема. Посмотрите ниже.

public interface ITest 
{ 
    void Test(string testInput); 
} 

public class TestImpl : ITest 
{ 
    public int TestId { get; private set; } 

    void ITest.Test(string testInput) 
    { 
    int intOut; //I think this is your point of confusion, right? 
    if (!int.TryParse(testInput, out intOut)) 
     return; 

    TestId = intOut; 
    } 
} 
+0

Он был удален, вероятно, потому что это был комментарий, а не ответ. – tnw

+0

А шанс улучшить пост был бы замечательным. По крайней мере, я пытался помочь ТО, но здесь были грубые правила ... Я буду считать это на будущее. – DHN

0

То же, что и DNH, на самом деле это не проблема.

Но, возможно, ваша проблема в том, что «как получить доступ к моему экземпляру viewmodel?»

В этом случае вы можете использовать шаблон обмена сообщениями MVVM, создать экземпляр singleton, который сохранит значение для всего приложения или использует статические свойства.

IMO, обмен сообщениями или однопользовательский «репозиторий» являются более подходящим выбором здесь, если у вас нет ссылок на экземпляр viewmodel.

+0

Что такое обмен сообщениями или одноэлементный репозиторий? – JLott

+0

Сообщения - это базовый шаблон, реализованный с помощью некоторой структуры MVVM, которая позволяет вам подписываться на некоторые типы сообщений и отправлять сообщения. http://www.galasoft.ch/mvvm/ и http://mvvmfoundation.codeplex.com/ реализовать один. –

+0

Для репозитория это также базовый шаблон, который позволяет хранить данные, проверять их, избегать дублирования и т. Д. И т. Д. Http://www.remondo.net/repository-pattern-example-csharp/ Но я упоминал term 0 ", p –

1

Вы уже определили публичный приемник и сеттер для своего accountID. Вы должны иметь доступ к переменной, создав экземпляр своего класса HistoryAuditLogViewModel.

Я должен упомянуть - снова - что ваш вопрос действительно плохо отформатирован. Когда я сделал комментарий о соответствующем коде, я не имел в виду, что вы должны просто опубликовать весь класс. Вам нужно найти конкретные точки боли в коде. Вы уже упоминали, что раньше вы не использовали Инавигацию. Если вы собираетесь вводить код в свою программу, вам нужно понять, что это такое и как оно работает.

Что вы пробовали ?? Вы работаете с какими-либо конкретными ошибками? Я не вижу, чтобы вы сами пытались решить проблему - нам очень сложно понять, что вы пытаетесь сделать здесь, и поэтому очень сложно ответить на ваш вопрос с какой-либо степенью полезности.

+0

Единственная ошибка, которую я получаю, заключается в том, Я думаю, проблема в том, что я не понимаю, как работает InavigationAware, потому что мне не нужно объявлять идентификатор accountID как общедоступное свойство или даже в глобальной области моего ViewModel. – JLott

Смежные вопросы