Задержка объявления переменной в XAML

Я пытаюсь завершить страницу C# / XAML и у меня возникли проблемы. В основном, когда я пытаюсь скомпилировать, он жалуется, что имя переменной (Courier_List) не существует в текущем контексте. Под понятием я понимаю, почему, поскольку это еще не было объявлено нигде в коде. Однако причина, по которой я не объявил это, состоит в том, что этот упакованный.dll предназначен для работы с пакетом управления (файл XML), который содержит это определение (Courier_List), определенный как список, и содержит координаты, указывающие визуальному компилятору, где размещать список в форме.

Я предполагаю, что решение должно состоять в том, чтобы объявить переменную списка в форме... но я не уверен, как (и если она будет работать) просто объявить переменную и не использовать ее где-либо в.dll, тогда, когда все вместе он вызовет Courier_List из пакета управления и не будет перепутан между двумя переменными с одинаковыми именами.

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

[assembly: CLSCompliant(true)]
namespace Flexity.RMA
{
  /// <summary>
  /// Interaction logic for UserControl1.xaml
  /// </summary>
  class RMATask : CreateWithLinkHandler
  {
      public RMATask()
      {
         try
         {
            // Sealed Class GUID
            this.createClassGuid = new Guid("9ebd95da-1b16-b9ea-274d-6b0c16ce1bf3");
            this.classToDelegate = new Dictionary<Guid, CreateLinkHelperCallback>()
            {
                { ApplicationConstants.WorkItemTypeId, new CreateLinkHelperCallback (this.WorkItemCallback) }
            };
         }
         catch (Exception exc1)
         {
            MessageBox.Show(exc1.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error);
         }
     }

     public void WorkItemCallback(IDataItem RMAForm, IDataItem IncidentForm)
     {
        try
        {
            // Note to self: RelatedWorkItems should be in MP XML as alias under TypeProjections
            if (RMAForm != null && RMAForm.HasProperty("RelatedWorkItems"))
            {
                // Perform Linking
                RMAForm["RelatedWorkItems"] = IncidentForm;
                // Copy Incident Title to RMA Title
                RMAForm["Title"] = IncidentForm["Title"];
                // Copy Incident Description to RMA Description
                RMAForm["Description"] = IncidentForm["Description"];
                // Copy Incident ID to RMA Display Name 
                RMAForm["DisplayName"] = "From " + IncidentForm["Id"];
            }
        }
        catch (Exception exc2)
        {
            MessageBox.Show(exc2.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }
}

public partial class WITemplate: UserControl
{
    private readonly RelatedItemsPane _relatedItemsPane;

    public WITemplate()
    {
        InitializeComponent();
        var paneConfig = new WorkItemRelatedItemsConfiguration("RelatedWorkItems", "RelatedWorkItemSource",
                                                           "RelatedConfigItems", "RelatedKnowledgeArticles",
                                                           "FileAttachments");
        _relatedItemsPane = new RelatedItemsPane(paneConfig);
        tabItemRelItems.Content = _relatedItemsPane;
    }

    private void Tracking_Button_Click(object sender, RoutedEventArgs e)
    {

        switch (Courier_List.SelectedValue.ToString())
        {
            case "UPS":

                System.Diagnostics.Process.Start("http://wwwapps.ups.com/ietracking/tracking.cgi?loc=CA_CA^&tracknum^=" + Tracking_Num.Text.ToString());
                break;

            case "FedEX":
                System.Diagnostics.Process.Start("https://www.fedex.com/fedextrack/index.html?tracknumbers^="+Tracking_Num.Text.ToString()+"^&locale=en_CA^&cntry_code=ca_english");
                break;

            case "UPS SCS":
                System.Diagnostics.Process.Start("https://www.upspostsaleslogistics.com/cfw/trackOrder.do?trackNumber^=" + Tracking_Num.Text.ToString());
                break;

            default:
                break;
        }
    }
 }
}

1 ответ

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

Итак, вам нужно будет создать переменную для использования в вашем Tracking_Button_Click обработчик для этого оператора switch. Это довольно распространенная модель; если где-то есть ресурс, который необходим в коде C#, у вас должна быть одна или две строки кода, которые ищут ресурс и присваивают его объявленной вами переменной.

Сделано правильно, вы не будете дублировать данные. Скорее система установит ссылку на существующие классы. Это, в свою очередь, позволит вам использовать пакет управления XML в коде C#.

У меня нет примеров для вашего пакета управления, но вот пара других, которые следуют шаблону. Если вы хотите попасть на ресурс XAML, вы делаете что-то вроде:

var myList = (XAMLResourceType) this.TryFindResource("myResourceKey");

Вам не нужно именно это, но вам нужно нечто очень похожее, в коде вашего обработчика. Тогда ваш switch Заявление будет работать.

Другие вопросы по тегам