Sql, Wpf, Xaml, C #, данные привязки, динамический ресурс, доступ к нестатическим данным, получение ссылки на объект - PullRequest
2 голосов
/ 01 декабря 2010

Хорошо, я довольно новичок в WPF и XAML, несмотря на мой поиск, я не смог найти простое решение, и мне кажется, что я не смогу найти ответ довольно скоро.

Вопрос настолько прост, что я создал проект WPF и у меня есть сетка данных в SelectList.xaml. После выбора строки я сохраняю выбранную строку в объекте, скажем, этот объект называется «категория». Пока все в порядке, но я не могу понять, как я собираюсь получить ссылку на этот объект из другого места temp.xaml?

Большое спасибо Любая помощь будет высоко оценена Приветствия

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

Распространенным способом обеспечения косвенной связи в WPF является использование шаблона посредника. Вы можете использовать посредник для публикации выбора вашей категории, а временный просмотр подписаться на уведомление об изменении выбора вашей категории.

См. http://www.eggheadcafe.com/tutorials/aspnet/ec832ac7-6e4c-4ea8-81ab-7374d3da3425/wpf-and-the-model-view-vi.aspx для простого примера конкретного посредника. Существует также несколько популярных сред MVVM, которые предоставляют реализации шаблонов Mediator, если вы хотите более надежную реализацию.

Реализация простого посредника:

public sealed class Mediator
{
    private static Mediator instance = new Mediator();
    private readonly Dictionary<string, List<Action<object>>> callbacks 
      = new Dictionary<string, List<Action<object>>>();

    private Mediator() { }

    public static Mediator Instance
    {
        get
        {
            return instance;
        }
    }

    public void Register(string id, Action<object> action)
    {
        if (!callbacks.ContainsKey(id))
        {
            callbacks[id] = new List<Action<object>>();
        }

        callbacks[id].Add(action);
    }

    public void Unregister(string id, Action<object> action)
    {
        callbacks[id].Remove(action);

        if (callbacks[id].Count == 0)
        {
            callbacks.Remove(id);
        }
    }

    public void SendMessage(string id, object message)
    {
        callbacks[id].ForEach(action => action(message));
    }
}

Код выбора SelectList.xaml:

private void DataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    var category = e.AddedItems.FirstOrDefault() as Category;

    if(category != null)
    {
        Mediator.Instance.SendMessage("Category Selected", category);
    }
}

Кодовый код Temp.xaml:

public Temp()
{
  InitializeComponent();

  Mediator.Instance.Register
  (
      "Category Selected",
      OnCategorySelected
  );
}

private void OnCategorySelected(object parameter)
{
  var selectedCategory = parameter as Category;

  if(selectedCategory != null)
  {
  }
}
0 голосов
/ 01 декабря 2010

Создайте доступный метод (общедоступный, если хотите), который принимает ссылку на этот объект категории в коде «Temp.xaml» за файлом.Затем с помощью этого метода передайте объект «категория» из кода «SelectList.xaml», стоящий за файлом, в файл «Temp.xaml».

...