使用MVVM

时间:2017-01-13 09:39:50

标签: c# wpf mvvm

在使用WPF MVVM和命令时,我遇到了更新实体的问题。

我的WPF看起来像:

    <Popup Margin="10,10,0,13" Name="UpdatePopup" HorizontalAlignment="Left" VerticalAlignment="Top" Width="450" Height="100" IsOpen="{Binding IsOpen, Mode=TwoWay}">
        <Border Padding="5" Background="WhiteSmoke">
            <StackPanel Orientation="Horizontal" DataContext="{Binding CommendationEntity}" Width="450" Height="100">
                <Label Content="Nazwa żódła" Margin="10,10,10,10" Width="75" Height="30"/>
                <TextBox Text="{Binding Name}" Margin="10,10,10,10" Width="130" Height="30" x:Name="Name" />
                <Button Command="{Binding DataContext.UpdateCommand, ElementName=UpdatePopup}" CommandParameter="{Binding id}" Content="Update" Margin="10,10,10,10" Width="80" Height="30"/>
                <Button Command="{Binding DataContext.CancelCommand, ElementName=UpdatePopup}" Content="Anuluj" Margin="10,10,10,10" Width="80" Height="30"/>
            </StackPanel>
        </Border>
    </Popup>

现在更新记录我需要id和新名称,所以我通过按钮绑定传递id,并且我在传递名称时遇到问题,我的更新方法如下:

    public void UpdateEntity(object obj)
    {
        this.CommendationEntity = this._catalog.Commendations.Single(entity => entity.id == (int)obj);
        this.CommendationEntity.Name = this.Name;

        this._catalog.Commendations.Attach(this.CommendationEntity);
        this._catalog.Entry(this.CommendationEntity).State = System.Data.Entity.EntityState.Modified;
        this._catalog.SaveChanges();
    }

在视图模型中,我有一个名为:

的属性
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name == value)
            {
                return;
            }
            this._name = value;
            RaisePropertyChanged("Name");
        }
    }

但是当我点击Update id作为(object obj)传递时,如果是,但是Name属性没有更新,那可能是什么错误?

也许它的数据上下文(DataContext =&#34; {Binding CommendationEntity}&#34;)作为模型名称和视图模型属性具有相同的名称?我是新的WPF,所以我错了。

或许有一种方法可以点击按钮,整个对象将作为(对象obj)传递?

3 个答案:

答案 0 :(得分:1)

this.Name表示Name属性与UpdateCommand属性属于同一个类,然后绑定到Name属性的路径应该以相同的方式设置:

<TextBox Text="{Binding DataContext.Name, ElementName=UpdatePopup}" Margin="10,10,10,10" Width="130" Height="30" x:Name="Name" />

否则您绑定到其他一些Name属性,或绑定完全失败。

答案 1 :(得分:0)

两种可能性:

  1. Name的绑定是否正确?对于您使用DataContext.UpdateCommand, ElementName=UpdatePopup的命令,所以也可能需要执行此操作。如果绑定失败,你不会得到异常,但你应该在VS的输出窗口中收到一条消息 - 值得在那里检查。
  2. 如果由于某种原因在名字设置器:if (_name == value)(也许两者都是空字符串?)为真,那么名称将不会更新。

答案 2 :(得分:0)

根据您的代码,您尝试将CommendationEntity的Name属性与文本框控件绑定。它没有得到更新,因为您尚未为this.CommendationEntity.Name属性实现NotifyPropertyChanged。您需要在CommendationEntity中实现INotifyProperty以反映CommendationEntity类的属性更改。