C#WPF-从任何类写入Listview

本文关键字:Listview 任何类 C#WPF- | 更新日期: 2023-09-27 18:27:19

我在MainWindow.xaml中有一个UI,在该窗口中我有一个ListView,我想用于所有日志记录。

如何从任何类写入此ListView,而不必在整个系统中传递窗口对象?

我试过在MainWindow代码背后制作一个名为Log(string)的方法,然后从另一个类(如MainWindow.Log("一些文本"))访问它,但没有乐趣!

也许我只是没有完全理解这个问题的面向对象部分:(

非常感谢您的帮助!

干杯,Dave

C#WPF-从任何类写入Listview

您可以通过以下方式实现简单绑定:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <ListView ItemsSource="{Binding Model.Items}" />
    </Grid>
</Window>

然后添加您的模型类:

public class MainWindowViewModel : INotifyPropertyChanged
{
    private ObservableCollection<string> items = new ObservableCollection<string>();
    public ObservableCollection<string> Items
    {
        get { return items; }
        set
        {
            items = value;
            OnPropertyChanged("Items");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}

并使用这个模型,即在您的代码背后。这有点棘手,应该移到某个控制器或类似的位置,但这超出了这个问题的范围。

public partial class MainWindow : Window
{
    public MainWindowViewModel Model { get; set; }
    public MainWindow()
    {
        Model = new MainWindowViewModel();
        InitializeComponent();
        Model.Items.Add("one");
        Model.Items.Add("two");
    }
}

因此,我们在xaml中有View,它的"代码隐藏"属性称为Model。这就是我们在中设置"DataContext"属性的原因。然后,我们有了ViewModel,它为我们的View保存数据。在MVVM模式中,我们称之为ViewModel。当然,您也可以实现一些ViewModel基础并将INotifyPropertyChange实现转移到那里,但这取决于您自己。您也可以以任何其他方式实现MVVM模式,但核心机制是相同的。

您正在使用WPF!因此,不要在后端语言中使用任何UI控件类型的实例。使用数据绑定(WPF主要针对它进行定制)将列表视图绑定到后端类的实例。并在后端传递该类的一个实例。

具体的基本实现不适合SO竞赛,但基本思想可能看起来像

class Log {
   .....
   List<string> logData; 
   public List<string> LogData { //PROPERTY ACTUALLY BOUND TO LIST VIEW UI
        get {
            return logData;
        }         
   }
   public void AddLog(string s) {
         logData.Add(s);
         NotifyPropertyChanged(.. LogData  ..);
   }
}

在您的代码的某个共享空间中创建Log log之后。任何执行AddLog的人都会将字符串添加到丢失的log中,并引发一个事件来更新UI。

对于数据绑定示例,可以查看:

WPF 中数据绑定的一个非常简单的例子

数据绑定概述

或者只是在谷歌上搜索更简单或更适合你的例子。

您可以通过Application.Current.MainWindow从应用程序中的任何位置访问MainWindow实例。它返回一个window类型的对象,这样您就可以将它放到主窗口类中。通常为MainWindow。总之:

(Application.Current.MainWindow as MainWindow).Log("some text")