Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在第二个窗口上绑定数据项_C#_Wpf_Xaml_Binding_Caliburn.micro - Fatal编程技术网

C# 在第二个窗口上绑定数据项

C# 在第二个窗口上绑定数据项,c#,wpf,xaml,binding,caliburn.micro,C#,Wpf,Xaml,Binding,Caliburn.micro,最后,我决定跳上WPF的潮流,并决定遵循MVVM模式来创建我的应用程序。我也在使用Caliburn.Micro 我发现了许多将数据绑定到Windows的示例,但所有示例都只包含一个主窗口。在打开第二个和第三个窗口时,我不知道如何引用和进行绑定。为了说明我的问题,我创建了一个简单的应用程序。此应用程序有两个窗口,主窗口名为ShellView,第二个窗口名为Window1View。在这个应用程序中,我只需要在Window1View的文本框中显示myStr1的内容 代码如下: Views.ShellV

最后,我决定跳上WPF的潮流,并决定遵循MVVM模式来创建我的应用程序。我也在使用Caliburn.Micro

我发现了许多将数据绑定到Windows的示例,但所有示例都只包含一个主窗口。在打开第二个和第三个窗口时,我不知道如何引用和进行绑定。为了说明我的问题,我创建了一个简单的应用程序。此应用程序有两个窗口,主窗口名为ShellView,第二个窗口名为Window1View。在这个应用程序中,我只需要在Window1View的文本框中显示myStr1的内容

代码如下:

Views.ShellView.xaml

<Window x:Class="Test.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock x:Name="Title" />
        <Button Content="Window 1" Height="31" HorizontalAlignment="Left" Margin="24,268,0,0" Name="btnWin1" VerticalAlignment="Top" Width="87" Click="btnWin1_click" />
    </Grid>
</Window>
<Window x:Class="Test.Views.Window1View"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
        Title="Window 1" Height="300" Width="300">
    <Grid>
        <Label Content="TextBox 1" Height="26" HorizontalAlignment="Left" Margin="12,40,0,0" Name="label1" VerticalAlignment="Top" Width="75" />
        <TextBox Height="29" HorizontalAlignment="Left" Margin="106,39,0,0" Name="txtBox1" VerticalAlignment="Top" Width="145" Text="{Binding myStr1}" />
    </Grid>
</Window>
<Application 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="Test.App">
    <Application.Resources>

    </Application.Resources>
</Application>
ViewModels.ShellViewModel.cs

namespace Test.Views
{
    using System.Windows;

    public partial class ShellView : Window
    {
        public ShellView()
        {
            InitializeComponent();
        }

        private void btnWin1_click(object sender, RoutedEventArgs e)
        {
            Window1View win1 = new Window1View();
            win1.Show();
        }
    }
}
namespace Test.ViewModels
{
    using Caliburn.Micro;

    public class ShellViewModel : PropertyChangedBase
    {
        public static string txt1 = "String 1";
        public static string txt2 = "String 2";

        private string title;
        public string Title
        {
            get { return title; }
            set
            {
                if (title != value)
                {
                    title = value;
                    RaisePropertyChangedEventImmediately("Title");
                }
            }
        }

        public ShellViewModel()
        {
            Title = "Hello Caliburn.Micro";
        }
    }
}
using System.Windows;

namespace Test.Views
{
    /// <summary>
    /// Interaction logic for Window1View.xaml
    /// </summary>
    public partial class Window1View : Window
    {
        public Window1View()
        {
            InitializeComponent();
        }
    }
}
namespace Test.ViewModels
{
    class Window1ViewModel
    {
        public Window1ViewModel()
        {
            myStr1 = ShellViewModel.txt1;
        }

        public string myStr1 { get; set; }
    }
}
namespace Test
{
    public class Bootstrapper : Caliburn.Micro.Bootstrapper<Test.ViewModels.ShellViewModel>
    {
    }
}
namespace Test
{
    using System.Windows;

    public partial class App : Application
    {
        Bootstrapper bootstrapper;

        public App()
        {
            bootstrapper = new Bootstrapper();
        }
    }
}
Views.Window1View.xaml

<Window x:Class="Test.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock x:Name="Title" />
        <Button Content="Window 1" Height="31" HorizontalAlignment="Left" Margin="24,268,0,0" Name="btnWin1" VerticalAlignment="Top" Width="87" Click="btnWin1_click" />
    </Grid>
</Window>
<Window x:Class="Test.Views.Window1View"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:c="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
        Title="Window 1" Height="300" Width="300">
    <Grid>
        <Label Content="TextBox 1" Height="26" HorizontalAlignment="Left" Margin="12,40,0,0" Name="label1" VerticalAlignment="Top" Width="75" />
        <TextBox Height="29" HorizontalAlignment="Left" Margin="106,39,0,0" Name="txtBox1" VerticalAlignment="Top" Width="145" Text="{Binding myStr1}" />
    </Grid>
</Window>
<Application 
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="Test.App">
    <Application.Resources>

    </Application.Resources>
</Application>
Bootstrapper.cs

namespace Test.Views
{
    using System.Windows;

    public partial class ShellView : Window
    {
        public ShellView()
        {
            InitializeComponent();
        }

        private void btnWin1_click(object sender, RoutedEventArgs e)
        {
            Window1View win1 = new Window1View();
            win1.Show();
        }
    }
}
namespace Test.ViewModels
{
    using Caliburn.Micro;

    public class ShellViewModel : PropertyChangedBase
    {
        public static string txt1 = "String 1";
        public static string txt2 = "String 2";

        private string title;
        public string Title
        {
            get { return title; }
            set
            {
                if (title != value)
                {
                    title = value;
                    RaisePropertyChangedEventImmediately("Title");
                }
            }
        }

        public ShellViewModel()
        {
            Title = "Hello Caliburn.Micro";
        }
    }
}
using System.Windows;

namespace Test.Views
{
    /// <summary>
    /// Interaction logic for Window1View.xaml
    /// </summary>
    public partial class Window1View : Window
    {
        public Window1View()
        {
            InitializeComponent();
        }
    }
}
namespace Test.ViewModels
{
    class Window1ViewModel
    {
        public Window1ViewModel()
        {
            myStr1 = ShellViewModel.txt1;
        }

        public string myStr1 { get; set; }
    }
}
namespace Test
{
    public class Bootstrapper : Caliburn.Micro.Bootstrapper<Test.ViewModels.ShellViewModel>
    {
    }
}
namespace Test
{
    using System.Windows;

    public partial class App : Application
    {
        Bootstrapper bootstrapper;

        public App()
        {
            bootstrapper = new Bootstrapper();
        }
    }
}
在此方面的任何帮助都将不胜感激。
谢谢

卡梅洛

也许我遗漏了一些东西,因为我不熟悉Caliburn.Micro,但我看到这里发生了一些事情

首先,我没有看到您将
Window1View
DataContext
设置为
Window1ViewModel
的实例


其次,您的
Window1ViewModel
不是从
PropertyChangedBase
派生的,当您更改myStr1属性时,您也不会调用
RaisePropertyChanged

在MVVM中实现视图模型通信的常用方法是使用。大多数MVVM框架都包含一个“Messenger”类,它允许您通过发布和订阅事件来解耦设计。在Caliburn Micro中,类支持中介

由于您是MVVM新手,我还建议您使用以下资源:

    • 这里有几件事:

    • 您正在不必要地使用代码隐藏。理想情况下,在使用MVVM时,您的目标应该是几乎没有代码落后。与其创建
      btnWin1\u单击
      处理程序,不如命名按钮并在视图模型上使用相同的名称实现方法。Micro将根据约定调用视图模型方法
    • 使用x:Name而不是Name
    • 显示
      Window1ViewModel
      时,您没有使用Caliburn.Micro调用窗口显示。这意味着
      Window1View
      Window1ViewModel
      之间不存在绑定。如果这是一个单独的窗口,请使用Caliburn.Micro中的
      WindowManager
      类型。实例化您的
      Window1ViewModel
      ,并使用
      WindowManager
      类来显示它。Micro将根据约定定位适当的视图,并将视图绑定到视图模型
    • 如前所述,不要直接在
      Window1ViewModel
      中引用
      ShellViewModel
      (这将耦合视图模型并降低
      Window1ViewModel
      的可重用性),而是使用中介模式。Caliburn.Micro附带一个类-您可以从
      ShellViewModel
      发布文本更改,并在
      Window1ViewModel
      中订阅事件

    • 男/女。如果你想让人们看到整个项目,只需在某个地方上传一个压缩文件。从这里开始查看Rob的3系列文章,了解屏幕导航的工作原理。同时检查caliburn下载的样本。谢谢devdigital,你的回复已经很好地扫清了迷雾。我将尝试让我的示例代码按照您的建议工作。相反,我将明确研究您提到的中介模式。同时也感谢您提供的资源。