C#WPF-从任何类写入Listview
我在MainWindow.xaml中有一个UI,在窗口中有一个ListView,我想用于所有日志记录 如何从任何类写入此ListView,而不必在整个系统中传递窗口对象 我曾尝试在MainWindow代码中创建一个名为Log(string)的方法,然后从另一个类(如MainWindow.Log(“一些文本”)访问它,但没有乐趣 也许我没有完全理解这个问题的整个面向对象部分:( 非常感谢您的帮助 干杯,C#WPF-从任何类写入Listview,c#,wpf,xaml,listview,C#,Wpf,Xaml,Listview,我在MainWindow.xaml中有一个UI,在窗口中有一个ListView,我想用于所有日志记录 如何从任何类写入此ListView,而不必在整个系统中传递窗口对象 我曾尝试在MainWindow代码中创建一个名为Log(string)的方法,然后从另一个类(如MainWindow.Log(“一些文本”)访问它,但没有乐趣 也许我没有完全理解这个问题的整个面向对象部分:( 非常感谢您的帮助 干杯, Dave您可以通过application.Current.MainWindow从应用程序中的任
Dave您可以通过
application.Current.MainWindow
从应用程序中的任何地方访问MainWindow实例。它返回一个window类型的对象,以便您将其保存到主窗口类中。通常MainWindow
。所有这些:
(Application.Current.MainWindow作为MainWindow)。记录(“一些文本”)
您正在使用WPF!因此不要在后端语言中使用任何UI控件类型实例。
使用WPF主要针对的数据绑定,将列表视图绑定到后端类的实例,并在后端的四周传递该类的实例
具体的基本实现并不适合这样的竞赛,但基本思想可能是这样的
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 ..);
}
}
类日志{
.....
列出日志数据;
公共列表日志数据{//属性实际绑定到列表视图UI
得到{
返回日志数据;
}
}
公共void AddLog(字符串s){
日志数据。添加(s);
NotifyPropertyChanged(…日志数据…);
}
}
之后,在一些共享空间中创建了您的代码Log
。
执行AddLog
的任何人都会将该字符串添加到丢失的log
,并引发事件以更新UI
有关数据绑定示例,请参见:
或者通过谷歌搜索更简单或更适合您的示例。您可以通过以下方式实现简单绑定:
<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>
因此,我们在xaml中有一个视图,它被绑定到名为Model的“代码隐藏”属性。这就是为什么我们在视图中设置了“DataContext”属性。然后,我们有了保存视图数据的ViewModel。在MVVM模式中,我们称它为ViewModel。
当然,您也可以实现一些ViewModel库,并在TifyPropertyChange实现中移动到那里,但这取决于您。您也可以以任何其他方式实现MVVM模式,但核心机制是相同的。如果您使用的是MVVM,只需将“共享”ViewModel传递给需要进行日志记录的每个适用类即可ListView将绑定到共享ViewModelSee
MVC
或(受WPF人员欢迎)MVVM
。让控制器或类似控制器的对象检索数据并用其填充ListView更有意义。在WPF中,通常这实际上是通过一些数据绑定来实现的(你也可以搜索以了解更多信息)。很好的帮助,伙计们,我的问题是我正试图创建一个完全像windows窗体一样的WPF程序!有没有合适的资源来“共享”我的ViewModel(我想这是我的主窗口?)这表示应用程序未在当前上下文中定义。我在using语句中有名称空间,我是否遗漏了什么(编辑:使用System.Windows添加,现在正在编译,测试时间!干杯。这实际上是有意义的,因此在我想要从中进行日志记录的任何其他类中,我将创建一个日志实例并使用它写入LV?很抱歉,没有问题!我相信列表
应该是ObservableCollection
,否则更改通知不起作用。@DavidC799不,实例必须是一个,所以日志的集合,真正的字符串的集合将是一个。只需在不同类型中使用同一个实例。感谢详细的帖子,肯定学到了一些东西。这一行让我有点不舒服:DataContext=“{Binding RelativeSource={RelativeSource Self}“
为什么我们需要这个?为了使绑定成为可能,所有控件都需要正确设置DataContext(直接或通过父控件)。在我的示例中,我们已将窗口的DataContext设置为其代码隐藏类-MainWindow。有关DataContext的详细信息,请单击此链接:
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");
}
}