如何从不同的窗口更新wpf列表框的内容

时间:2015-05-14 13:34:02

标签: c# wpf listbox

我有两个窗口:主窗口,日志窗口。如果在主窗口中发生某些操作(例如单击按钮),如何在日志窗口中更新列表框?

以下是日志窗口中列表框的代码:

<ListBox x:Name="DebugLogLb" BorderBrush="{x:Null}">  
  <TextBlock x:Name="DebugLogTb" Text="{Binding LogText}" Background="{x:Null}" />
</ListBox>

单击主窗口中的按钮时,它将更新列表框。我尝试使用下面的代码,但它不起作用。

private void Btn1_Click(object sender, RoutedEventArgs e)
{
    var log = new LogWindow();
    log.DebugLogLb.Items.Add(new { LogText = "Button 1 is clicked" });
}

如果我把所有内容都放在同一个窗口中,我就可以更新列表框,但是我没有用两个窗口这样做。

我的预期输出如下: enter image description here

即使两个窗口都打开了,当点击主窗口中的按钮时,它也会直接在日志窗口中更新。

感谢先进的任何帮助。

1 个答案:

答案 0 :(得分:3)

如果没有看到更多代码,很难说出错的地方。这是一个有效的例子。它在LogWindow ctor中创建一个新的MainWindow并设置DataContext。单击该按钮时,处理程序调用窗口上的show。 ListBox的itemssource属性绑定到ObservableCollection个字符串。因此,任何添加/删除都会在UI上自动更新。

LogWindows xaml

<Window x:Class="WpfApplication7.LogWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="LogWindow" Height="300" Width="300">
<Grid>
    <ListBox x:Name="DebugLogLb" BorderBrush="{x:Null}" ItemsSource="{Binding LogText}" />
</Grid>


MainWindow代码隐藏

public partial class MainWindow : Window
{
    LogWindow _logWindow;

    public MainWindow()
    {
        InitializeComponent();

        LogText = new ObservableCollection<string>();

        _logWindow = new LogWindow();
        _logWindow.DataContext = this;
        _logWindow.Closed += _logWindow_Closed;
    }

    private void _logWindow_Closed(object sender, EventArgs e)
    {
        _logWindow = new LogWindow();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        _logWindow.Show();

        LogText.Add("Button1 Clicked");
    }

    public ObservableCollection<string> LogText { get; set; }
}