WPF Caliburn Micro CanExecute when property of binded object changes

丶灬走出姿态 提交于 2019-12-07 17:09:03

问题


I have the problem, that my CanSave method doesn't get called, when I change a binded property.

View

The View contains of some Labels and TextBoxes... nothing special...

The TextBoxes are binded to the properties of an object.

<Label Target="{Binding ElementName=txtTitle}" Grid.Column="0" Grid.Row="0" Content="Titel" Foreground="White" />
<TextBox Name="txtTitle" Grid.Column="1" Grid.Row="0" Text="{Binding NewBook.Title}" />

<Label Target="{Binding ElementName=txtAuthor}" Grid.Column="0" Grid.Row="1" Content="Autor" Foreground="White" />
<TextBox Name="txtAuthor" Grid.Column="1" Grid.Row="1" Text="{Binding NewBook.Author}"/>

<Label Target="{Binding ElementName=txtIsbn}" Grid.Column="0" Grid.Row="2" Content="ISBN" Foreground="White" />
<TextBox Name="txtIsbn" Grid.Column="1" Grid.Row="2" Text="{Binding NewBook.Isbn}" />

<Label Target="{Binding ElementName=txtPrice}" Grid.Column="0" Grid.Row="3" Content="Preis" Foreground="White" />
<TextBox Name="txtPrice" Grid.Column="1" Grid.Row="3" Text="{Binding NewBook.Price}"/>

<Button Grid.Column="1" Grid.Row="4" Content="Speichern" Name="SaveBook" />

ViewModel

The ViewModel defines the property NewBook and the methods CanSaveBook and SaveBook

public Book NewBook
{
    get { return this.newBook; }
    set
    {
        this.newBook = value;
        this.NotifyOfPropertyChange(() => this.NewBook);
        this.NotifyOfPropertyChange(() => this.CanSaveBook);
    }
}

public bool CanSaveBook
{
    get
    {
        return !string.IsNullOrEmpty(this.NewBook.Title) 
                && !string.IsNullOrEmpty(this.NewBook.Author)
                && !string.IsNullOrEmpty(this.NewBook.Isbn) 
                && this.NewBook.Price != 0;
    }
}

public void SaveBook()
{
    try
    {
        this.xmlOperator.AddBook(ConfigurationManager.AppSettings.Get("BookXmlPath"), this.NewBook);
    }
    catch (Exception ex)
    {
        throw ex;
    }

    this.NewBook = new Book();
}

What I want is, that the Save-Button is only available, when CanSaveBook returns true but that the CanSaveBook-Method is checked after the user enters information in the textboxes... what am I missing?


回答1:


The problem you are having is that changing a property of the book does not raise INotifyPropertyChange on the view model. Easiest would be to get rid of the Book class and put the Name, Price, ISBN properties straight in the view model. Then raise INotifyPropertyChange in the setters (and make sure that the binding is two-way).

You can then construct the Book in the SaveBook method and call your service with it.



来源:https://stackoverflow.com/questions/32333022/wpf-caliburn-micro-canexecute-when-property-of-binded-object-changes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!