#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: Ты пробовал это?