我有两个窗口:主窗口,日志窗口。如果在主窗口中发生某些操作(例如单击按钮),如何在日志窗口中更新列表框?
以下是日志窗口中列表框的代码:
<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" });
}
如果我把所有内容都放在同一个窗口中,我就可以更新列表框,但是我没有用两个窗口这样做。
我的预期输出如下:
即使两个窗口都打开了,当点击主窗口中的按钮时,它也会直接在日志窗口中更新。
感谢先进的任何帮助。
答案 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; }
}