在ViewModel中使用变量

时间:2013-03-04 14:42:42

标签: c# wpf variables mvvm

我有一个简单的问题,我相信有人可以帮助我。如何在accountID方法中使用我的INavigationAware变量,然后在另一个类中使用它们?

以下是我的代码:

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中运行查询,将查询结果放在数据网格视图中。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您已经为accountID定义了公开的getter和setter。您应该能够通过创建HistoryAuditLogViewModel类的实例来访问变量。

我应该再次提到 - 你的问题格式很差。当我对相关代码发表评论时,我并不是说你应该发布整个课程。您需要找到代码的具体痛点。您已经提到过之前没有使用过INAVigation。如果您要将代码放入您的程序中,您需要了解它是什么以及它是如何工作的。

您尝试了什么?您是否遇到过任何特定错误?我没有看到你自己在这里尝试过这个问题 - 我们很难理解你在这里想要完成什么,因此很难以任何程度的帮助回答你的问题。

答案 1 :(得分:0)

与DNH相同,不会真正解决问题。

但也许您的问题更多是“如何获取对我的viewmodel实例的访问权限?”

在这种情况下,您可以使用MVVM的消息传递模式,创建一个单例实例,该实例将存储整个应用程序的值或使用静态属性。

如果您没有对viewmodel实例进行任何引用,那么IMO,消息传递或单例“存储库”是更合适的选择。

答案 2 :(得分: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; 
  } 
}