WPF Caliburn Micro CanExecute when 属性 of bind object changes
WPF Caliburn Micro CanExecute when property of binded object changes
我有一个问题,当我更改绑定的 属性.
时,我的 CanSave
方法没有被调用
查看
视图包含一些 Labels
和 TextBoxes
...没什么特别的...
文本框绑定到对象的属性。
<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 定义了 属性 NewBook
以及方法 CanSaveBook
和 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();
}
我想要的是,Save-Button
仅在 CanSaveBook
returns true
时可用,但 CanSaveBook
-方法在之后检查用户在文本框中输入信息...我错过了什么?
您遇到的问题是,更改本书的 属性 不会在视图模型上引发 INotifyPropertyChange。最简单的方法是去掉 Book class 并将 Name、Price、ISBN 属性直接放在视图模型中。然后在 setter 中引发 INotifyPropertyChange(并确保绑定是双向的)。
然后您可以在 SaveBook 方法中构造 Book 并使用它调用您的服务。
我有一个问题,当我更改绑定的 属性.
时,我的CanSave
方法没有被调用
查看
视图包含一些 Labels
和 TextBoxes
...没什么特别的...
文本框绑定到对象的属性。
<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 定义了 属性 NewBook
以及方法 CanSaveBook
和 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();
}
我想要的是,Save-Button
仅在 CanSaveBook
returns true
时可用,但 CanSaveBook
-方法在之后检查用户在文本框中输入信息...我错过了什么?
您遇到的问题是,更改本书的 属性 不会在视图模型上引发 INotifyPropertyChange。最简单的方法是去掉 Book class 并将 Name、Price、ISBN 属性直接放在视图模型中。然后在 setter 中引发 INotifyPropertyChange(并确保绑定是双向的)。
然后您可以在 SaveBook 方法中构造 Book 并使用它调用您的服务。