MVVM分发对象

时间:2015-05-12 10:31:50

标签: c# wpf mvvm

也许这只是解决方案的一小步,但到目前为止还无法实现。

我为DataContextBinding做了一些WPF教程,但我无法理解如何在(例如)两页之间共享上下文和/或绑定。

例如,当你看到这个时:https://msdn.microsoft.com/en-us/library/ms754356%28v=vs.110%29.aspx

<Label>Enter a Name:</Label>
<TextBox>
    <TextBox.Text>
        <Binding Source="{StaticResource myDataSource}" Path="Name" UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
</TextBox>

<Label>The name you entered:</Label>
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>

这将是结果:

enter image description here

这是一个简单的例子,运行和理解这一点没有问题,但我想要的是:

  1. 从后面的代码中填写TextBoxLabel。我尝试命名TextBox tb ,然后只需拨打tb.Text = "some text" - 它就可以了。我还尝试为DataContextTextBox分配Label,然后创建一个对象并使用该对象填充 DataContext - 这也有效。
  2. Label放在另一页上。
  3. 问题2对我来说真的很难,特别是与问题1相结合。 例如:当我在第1页构造函数中创建对象并为其分配DataContext(ofcourse)时,只有第1页上的TextBox将包含该值。

    我根本不知道如何分享我在第1页和第2页中声明的这个对象,并将其设置为DataContext

    也许我还没有找到完美的教程或解释,让我了解DataContextBinding如何真正起作用,以及如何在页面和窗口之间共享对象。

    你们可以帮助我吗?

    如果您需要更多信息,请随时提问;)

1 个答案:

答案 0 :(得分:0)

public class MySharedDataContext : INotifyPropertyChanged
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set
        {
            if (value == _name) return;
            _name = value;
            OnPropertyChanged();
        }
    }
}

在app.xaml中创建共享资源:

<Application x:Class="WpfApplication1.App"
             xmlns:my="clr-namespace:WpfApplication1">
    <Application.Resources>

        <my:MySharedDataContext x:Key="MySharedDataContext" />

现在您可以在两个页面中使用共享资源:

<TextBox Text="{Binding Name, Source={StaticResource MySharedDataContext}" />

如果要发送Name值,最好不要直接访问TextBox,而是在MySharedDataContext类中设置它:

var dataContext = (MySharedDataContext)FindResource("MySharedDataContext");
dataContext.Name = "John Smith";