gpt4 book ai didi

WPF 绑定(bind)自定义输出窗口

转载 作者:行者123 更新时间:2023-12-04 01:42:54 31 4
gpt4 key购买 nike

我正在尝试为绑定(bind)到我的 ViewModel 的软件创建一个自定义输出窗口。通常在过去我一直使用文本框并使用 appendText()方法写入输出窗口。当然,使用 ViewModel 并尝试绑定(bind)到文本框,看来您只能绑定(bind)到 Text属性(property)。以下是我正在尝试做的事情:

XAML:

<TextBox Text="{Binding Output}"></TextBox>

C#
public class ViewModel : DependencyObject
{
public static readonly DependencyProperty OutputProperty = DependencyProperty.Register("Output", typeof(ObservableCollection<string>), typeof(MVVMTestViewModel), new UIPropertyMetadata(null));

public ObservableCollection<string> Output
{
get
{
return (ObservableCollection<string>)GetValue(OutputProperty);
}
set
{
SetValue(OutputProperty, value);
}
}

public ViewModel()
{
Output = new ObservableCollection<string>();
}

public void OutputMessage(string message)
{
Output.Add(message);
}
}

当然这是不可能的,因为 Text 不能分配给 Observable Collection。

注:我可以使用 ListView 或 ListBox 并使用可观察的集合。但我不喜欢选择模式。我希望能够突出显示 TextBox 的文本,以便我可以将其复制并粘贴到窗口之外。 isReadOnly属性使我可以很容易地做到这一点。

是否有捷径可寻?另一个我可能没有想到的控件?

最佳答案

我认为 Thomas 所说的是您可以在 Window 的代码隐藏中包含以下内容:

public partial class MyWindow : Window
{
ViewModel _vm;

public MyWindow(ViewModel vm)
{
InitializeComponent();
_vm = vm;
_vm.Output.CollectionChanged += Output_CollectionChanged;
}

void Output_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
foreach(object item in e.NewItems)
{
outputTextBox.AppendText(item.ToString());
}
}
}

这样,窗口类将自动附加任何添加到输出集合的文本。

另一种方法(尽管它可能不被视为纯 MVVM)是使用如下接口(interface):
public interface IAppendOutput
{
void Append(string text);
}

public partial class MyWindow : Window, IAppendOutput
{
public MyWindow()
{
InitializeComponent();
}

public void Append(string text)
{
outputTextBox.AppendText(text);
}
}

public class ViewModel
{
IAppendOutput _outputter;
public ViewModel(IAppendOutput outputter)
{
_outputter = outputter;
}

public void AppendOutput(string text)
{
_outputter.Append(text);
}
}

然后在您的主应用程序中:
...
MyWindow window = new MyWindow();
ViewModel vm = new ViewModel(window);
window.DataContext = vm;
window.Show();
vm.AppendOutput("This is a test.");
...

这种方法可能不是最好的方法,但它可能是在其他情况下编写快速胶带代码的有用方法。它仍然是可单元测试的,因为 ViewModel 不知道窗口本身,只有一个接口(interface)。它仍然很灵活,因为您可以自定义任何类型的对象,以便它实现 IAppendOutput 接口(interface)。

关于WPF 绑定(bind)自定义输出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1791903/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com