好的,所以我有一个使用MVVM模式的WPF应用程序。
我有一个DataGrid,ItemsSource绑定到一个ObservableCollection和SelectedItem绑定到我的Model的一个属性,名为CurrentCategory
<DataGrid x:Name="LstCategories" Grid.Column="0" Grid.Row="1" AutoGenerateColumns="false" IsReadOnly="True"
ItemsSource="{Binding Path=ReceivedCategories, Mode=TwoWay}"
HorizontalScrollBarVisibility="Disabled" GridLinesVisibility="None"
CanUserAddRows="False" CanUserDeleteRows="False" CanUserSortColumns="True" Background="White"
SelectedIndex="{Binding Path=SelectedIndex}"
SelectedItem="{Binding CurrentCategory, UpdateSourceTrigger=PropertyChanged}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Description}" IsReadOnly="True" Header="Description" Width="300" />
</DataGrid.Columns>
</DataGrid>
TextBox Text绑定到CurrentCategory的Description属性。
<TextBox x:Name="TbDescription" Grid.Row="0" Grid.Column="1" Width="250" Height="Auto"
VerticalAlignment="Center" HorizontalAlignment="Left" Margin="10,0,0,0"
Text="{Binding Path=CurrentCategory.Description, Mode=TwoWay}" />
最后是一个用于将描述更新到数据库的按钮。
<Button Grid.Row="1" Grid.Column="1" HorizontalAlignment="Left" Margin="10,0,0,0"
Height="20" Width="120" Content="Update Description"
Command="{Binding UpdateCategoryCommand}"
CommandParameter="{Binding Path=CurrentCategory.CategoryId}" />
这一切都与预期的一样。
但是,我不希望在更改TextBox中的文本时自动编辑DataGrid记录。
因此将绑定设置为One-Way是合乎逻辑的。但是当我单击更新按钮时,Description属性仍然是旧值。
我已尝试过各种数据绑定模式,无法获得我想要的确切行为。
看起来像捕获22的情况。
有关获得我追求的行为的任何想法吗?
编辑1 - 工作解决方案
正如Amine所提到的,我添加了一个额外的属性并将TextBox绑定到它。我还必须在CurrentCategory中添加一个值为null的检查。可能是因为绑定到SelectedItem和ItemsSource,并且当DataGrid重新填充时,它会绑定到什么,使其为null。无论如何我的理论。
最后更改了检查是否应该启用更新按钮的方法,以及更新数据库以使用EditedCategory属性的方法。
工作代码:
private CategoryModel _currentCategory;
public CategoryModel CurrentCategory
{
get { return _currentCategory; }
set
{
if (value != null)
{
_currentCategory = value;
EditedCategory = new CategoryModel
{
CategoryId = value.CategoryId,
Description = value.Description
};
OnPropertyChanged("CurrentCategory");
}
}
}
private CategoryModel _editedCategory;
public CategoryModel EditedCategory
{
get { return _editedCategory; }
set
{
_editedCategory = value;
OnPropertyChanged("EditedCategory");
}
}
/// <summary>
/// Checks whether the Update button should be enabled or disabled
/// </summary>
/// <returns>True or False</returns>
public bool CanUpdateCategory()
{
return !String.IsNullOrWhiteSpace(EditedCategory.Description);
}
/// <summary>
/// Method to update the selected category
/// </summary>
/// <param name="id"></param>
public void UpdateCategory(int id)
{
if (CurrentCategory.UpdateCategory(id, EditedCategory.Description))
GetCategories();
}
答案 0 :(得分:1)
您还需要另一个属性:“EditedCategory”。 在DataGrid中选择项目时,必须为EditedCategory创建一个新实例。
private object currentCategory;
public object CurrentCategory
{
get { return currentCategory; }
set
{
currentCategory = value;
EditedCategory = new object{ id = value.id....}
this.OnPropertyChanged("CurrentCategory");
}
}
private object editedCategory;
public object EditedCategory
{
get { return editedCategory; }
set
{
editedCategory = value;
this.OnPropertyChanged("EditedCategory");
}
}
将TexBox绑定到EditedCategory。