<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="260">
<StackPanel>
<TextBox Height="23" x:Name="TextBox" TextWrapping="Wrap" Text="{Binding Test, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</Window>
static class Program
{
[STAThread]
static void Main()
{
var win = new MainWindow();
var vm = new ViewModel();
win.DataContext = vm;
vm.Test = "Testing";
//var app = new Application();
//app.Run(win);
var text = win.TextBox.Text;
}
public class ViewModel
{
public string Test { get; set; }
}
如果按原样运行应用程序,变量text
的值将为空字符串。如果我取消注释作为WPF应用程序运行窗口的两行,它将是&#34; Testing&#34;,这意味着TextBox绑定到类{{1}上的属性Test
}只有在我跑步时才有效申请。
有没有办法在没有实际运行应用程序的情况下进行绑定工作?
答案 0 :(得分:2)
如果您在DependencyObject
(使用BindingOperations.SetBinding
)上手动设置绑定并指定了Source
,则即使应用程序未运行,绑定也能正常运行。
所以在这种情况下,我认为问题是Window
尚未加载,因此可视树尚未就绪,因此DataContext
传播无法正常工作,所以绑定没有来源。
答案 1 :(得分:0)
有可能但你必须这样做:
var win = new MainWindow();
var vm = new ViewModel(); // Remove this line
win.DataContext = vm; // Remove this line
vm.Test = "Testing"; // Remove this line
在您的XAML中,更改此内容:
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YourViewModelNameSpace" // Add this, change to correct namespace
Title="MainWindow" Height="350" Width="260">
<Window.DataContext> // Add this tag and contents
<local:ViewModel/> // This instantiates the ViewModel class and assigns it to DataContext
</Window.DataContext>
<StackPanel>
<TextBox Height="23" x:Name="TextBox" TextWrapping="Wrap" Text="{Binding Test, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
你的班级:
public class ViewModel
{
public ViewModel() // Add this constructor
{
Test = "Testing";
}
public string Test { get; set; }
}
在XAML中,您可能需要删除解释性注释。
这是我得到它的方式: