Как изменить содержимое списка в другом окне WPF

#c# #wpf #list

Вопрос:

У меня есть два окна WPF, одно со списком, а другое, которое должно изменять содержимое этого списка. Как я мог это сделать?

Большое спасибо за ваше время.

Комментарии:

1. Если одно из окон является диалоговым окном, вы можете просто передать текст данных главного окна в диалоговое окно и обновить его после закрытия. Если оба окна открыты одновременно. Лично мне нравится использовать статический класс или более глобальный центральный объект в качестве посредника. Если это станет обычным шаблоном, я, вероятно, попытаюсь решить его лучшим способом, но если это единственный выход, я просто использую что-то центральное.

Ответ №1:

Простейший пример

введите описание изображения здесь

Модель:

 using System; using System.Collections.ObjectModel;  namespace WpfApp1 {  internal class Model  {  public Model()  {  AddStuff = new RelayCommand(() =gt; Collection.Add(DateTime.Now.ToString()));  }   public RelayCommand AddStuff { get; }   public ObservableCollectionlt;stringgt; Collection { get; } = new();  } }  

Команда:

 #nullable enable using System; using System.Windows.Input;  namespace WpfApp1 {  public class RelayCommand : ICommand  {  private readonly Funclt;boolgt; _canExecute;  private readonly Action _execute;   public RelayCommand(Action execute) : this(execute, () =gt; true)  {  }   public RelayCommand(Action execute, Funclt;boolgt; canExecute)  {  _execute = execute;  _canExecute = canExecute;  }   public bool CanExecute(object? parameter)  {  return _canExecute();  }   public void Execute(object? parameter)  {  _execute();  }   public event EventHandler? CanExecuteChanged;  } }  

App.xaml: модель является общей

 lt;Application x:Class="WpfApp1.App"  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  xmlns:local="clr-namespace:WpfApp1"  StartupUri="Window1.xaml"gt;  lt;Application.Resourcesgt;  lt;local:Model x:Key="Model" /gt;  lt;/Application.Resourcesgt; lt;/Applicationgt;  

Окно 1:

 lt;Window  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  x:Class="WpfApp1.Window1"  mc:Ignorable="d"  Title="Window1" Height="450" Width="800" DataContext="{StaticResource Model}"gt;  lt;Gridgt;  lt;ListBox ItemsSource="{Binding Collection}" /gt;  lt;/Gridgt; lt;/Windowgt;  

Окно 1:

 using System.Windows;  namespace WpfApp1 {  public partial class Window1  {  public Window1()  {  InitializeComponent();  Loaded  = OnLoaded;  }   private void OnLoaded(object sender, RoutedEventArgs e)  {  new Window2().Show();  }  } }  

Окно 2:

 lt;Window x:Class="WpfApp1.Window2"  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"  mc:Ignorable="d"  Title="Window2" Height="450" Width="800" DataContext="{StaticResource Model}"gt;  lt;Gridgt;  lt;Button Content="Whatever" Command="{Binding AddStuff}" /gt;  lt;/Gridgt; lt;/Windowgt;  

Окно 2:

 namespace WpfApp1 {  public partial class Window2  {  public Window2()  {  InitializeComponent();  }  } }  

Ответ №2:

Например, сохранив ссылку на окно, подлежащее обновлению, из другого окна или получив ссылку на это окно с помощью Application.Current.Windows свойства:

 var listBoxInWindow1 = Application.Current.Windows.OfTypelt;Window1gt;()?  .FirstOrDefault()?.listBox1;  

Window1.xaml:

 lt;ListBox x:Name="listBox1" .... /gt;  

Комментарии:

1. @ItsDano: Ты пробовал это?