在View中访问DataContext属性

时间:2014-09-12 14:44:53

标签: c wpf mvvm

我希望有人可以给我一个正确的方向,我正在学习WPF和MVVM - 让我们说它不是一帆风顺。基本上我正在尝试访问DataContext的属性并将它们绑定到我视图中的属性。我会完全诚实,我有点纠结。

当用户点击相关按钮时,它会触发下面的代码。

 private void OnReceiptClick(object sender, RoutedEventArgs e)
    {
        var dialogBox = new DisplayReceiptView(((CheckMemberViewModel) this.DataContext).ReceiptViewModel);
        dialogBox.ShowDialog();
    }

我的CheckMemberViewModel目前拥有我所追求的'Person'属性,在此阶段DataContext按预期填充。

我的DisplayReceiptView背后的代码如下所示:

 public DisplayReceiptView(ReceiptViewModel context) : this()
    {
        this.DataContext = context;
    }

一切似乎都是正确的,最后在我的XAML中

<Grid DataContext="{Binding Path=Person}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="10"/>
            <ColumnDefinition Width="150"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="10" />
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Label Grid.Column="1" Grid.Row="1">Name:</Label>
        <TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Path=Person.Forename}"></TextBox>
      </Grid>

不幸的是,无论我做了什么,而且我认为我现在所处的位置是最接近的,数据似乎并没有结合。下面是属性

的ViewModel代码
       private Person _person;
        public Person Person
    {
        get { return _person; }
        set
        {
            if (value != _person)
            {
                _person = value;
                OnPropertyChanged("Person");
            }
        }
    }

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

<TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Path=Person.Forename}"></TextBox>

这是错误的,因为你已经绑定了人

<TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Forename}"></TextBox>

你需要的只是

<TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Forename, Mode=TwoWay}"></TextBox>

将保存对源的更改并检索更改,但当然您需要保存上下文更改以使其永久化