使用MVVM的WPF应用程序 - 在编辑绑定的TextBox时阻止编辑DataGrid记录的绑定

时间:2016-04-18 14:38:03

标签: wpf mvvm data-binding

好的,所以我有一个使用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();
    }

1 个答案:

答案 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。