使绑定工作而不运行应用程序

时间:2014-11-26 10:20:17

标签: c# wpf data-binding .net-4.5

<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 }只有在我跑步时才有效申请。

有没有办法在没有实际运行应用程序的情况下进行绑定工作?

2 个答案:

答案 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中,您可能需要删除解释性注释。

这是我得到它的方式: enter image description here