C#WPF-从任何类写入Listview
本文关键字:Listview 任何类 C#WPF- | 更新日期: 2023-09-27 18:27:19
我在MainWindow.xaml中有一个UI,在该窗口中我有一个ListView,我想用于所有日志记录。
如何从任何类写入此ListView,而不必在整个系统中传递窗口对象?
我试过在MainWindow代码背后制作一个名为Log(string)的方法,然后从另一个类(如MainWindow.Log("一些文本"))访问它,但没有乐趣!
也许我只是没有完全理解这个问题的面向对象部分:(
非常感谢您的帮助!
干杯,Dave
您可以通过以下方式实现简单绑定:
<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")
。