【问题标题】:How to update the content of wpf listbox from different window如何从不同的窗口更新 wpf 列表框的内容
【发布时间】:2015-05-14 13:34:02
【问题描述】:

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

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

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

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

我的预期输出如下:

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

感谢任何高级帮助。

【问题讨论】:

  • 使用一些事件聚合器框架,如 Calibur.Micro caliburnmicro.codeplex.com
  • 每次点击按钮时是否创建一个新窗口?
  • @Ywah log.DebugLogLb.Items 的类型是什么?你如何将你的列表框绑定到它(如果你绑定它)?或者您是否将所有这些项目的文本聚合到一个文本属性中?很难说这段代码出了什么问题 - 它没有显示太多。
  • 嗨@user2697817,不,我只想创建一次窗口,如果我没有打开日志窗口,则必须在日志中更新主窗口中的事件(按钮点击)窗口。
  • 嗨@Eugene Podskal,我使用文本块将文本绑定到列表框。还有其他更好的方法来绑定文本吗?我不会将所有这些事件(按钮点击)聚合到一个属性中。其实我想要的是当按钮1被点击时,“按钮1被点击”将显示在日志窗口中,接下来如果按钮3被点击,“按钮3被点击”将显示在第一个下方。

标签: c# wpf listbox


【解决方案1】:

如果不查看更多代码,很难判断哪里出错了。这是一个有效的例子。它在MainWindow ctor 中创建一个新的LogWindow 并设置DataContext。单击按钮时,处理程序调用显示在窗口上。 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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多