Search code examples
c#wpfdata-bindingxamldynamicresource

Sql, Wpf, Xaml, C#, Binding data, Dynamic resource, accessing to non-static data, Obtaining a Reference to an Object


Ok, well I am pretty pretty pretty new to WPF and XAML, despite my search I could not find a simple solution and it seems to me that I won't be able to find an answer pretty soon.

The question is so simple, I have created a WPF project and have a datagrid in SelectList.xaml Once a row selected, I save the selected row in an object say this object called "category". So far everything is ok but I can't figure out how I am going to obtain a reference to this object from an other place temp.xaml ?

Thanks very much Any help will be highly appreciated Cheers


Solution

  • A common way to provide indirect communication in WPF is to leverage the Mediator pattern. You can use a mediator to publish the selection of your category, and have the temp view subscribe to notification of a change in selection of your category.

    See http://www.eggheadcafe.com/tutorials/aspnet/ec832ac7-6e4c-4ea8-81ab-7374d3da3425/wpf-and-the-model-view-vi.aspx for a simple example of a concrete mediator. There are also several popular MVVM frameworks available that provide Mediator pattern implementations if you want a more robust implementation.

    Simple Mediator implementation:

    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 code-behind:

    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 code-behind:

    public Temp()
    {
      InitializeComponent();
    
      Mediator.Instance.Register
      (
          "Category Selected",
          OnCategorySelected
      );
    }
    
    private void OnCategorySelected(object parameter)
    {
      var selectedCategory = parameter as Category;
    
      if(selectedCategory != null)
      {
      }
    }