C#WPF-从任何类写入Listview

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从应用程序中的任

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

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

我曾尝试在MainWindow代码中创建一个名为Log(string)的方法,然后从另一个类(如MainWindow.Log(“一些文本”)访问它,但没有乐趣

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

非常感谢您的帮助

干杯,
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");
    }
}