【问题标题】:Update Listview after database has updated (WPF + MVVM)数据库更新后更新 Listview (WPF + MVVM)
【发布时间】:2019-10-14 10:41:07
【问题描述】:

我有一个小的 WPF 表单,其中包含 Listview(绑定到 observablecolletion)

    <ListView Name="Employees_Listview" ItemsSource="{Binding Employees, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding YourSelectedItem, Mode=TwoWay}" Height="86" IsSynchronizedWithCurrentItem="True">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}"/>
                <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}"/>
            </GridView>
        </ListView.View>
    </ListView>

2 个文本框

<TextBox Name="FirstName" Width="136" Text="{Binding SelectedItem.FirstName, ElementName=Employees_Listview, Mode=TwoWay}" />
<TextBox Name="LastName" Width="136" Text="{Binding SelectedItem.LastName, ElementName=Employees_Listview, Mode=TwoWay}" />

还有一个按钮

<Button Command="{Binding UpdateEmployeeCommand}" Margin="0,0,10,0">Update</Button>

两个文本框都绑定到列表视图中的选定项目,因此当我更新文本框值时,它将自动反映列表视图中的更改。现在我想先更新数据库 如果没有错误,我想更新列表视图。我的更新代码是这样的

    var container = ContainerConfig.Configure();
    using (var scope = container.BeginLifetimeScope())
    {
        var SelectedEmployee = scope.Resolve<IEmployeeRepository>();
        if (!SelectedEmployee.Update(YourSelectedItem))
        {
            MessageBox.Show("Datensatz konnte nicht aktualisiert werden!" + "\n" + "Bitte den Administrator verständigen!");
            return;
        };
    }

我尝试将文本框模式设置为 OneWay,但由于它绑定到 SelectedItem,我无法获得新的文本框值,只能获得“旧”列表视图值。 如何在刷新列表视图之前先检查和更新我的数据库?

更新 也许我必须选择另一种这样的方法: TextBox 绑定了一个声明的新属性

查看

<TextBox Text="{Binding NewFirstName}" Width="123"></TextBox>

还有我的 ViewModel

//TEST
private string newfirstname;


public string NewFirstName
{
    get { return newfirstname; }
    set
    {
        newfirstname= value;
        RaisePropertyChanged("NewFirstName");
    }
}
//TEST
public EmployeeEntity YourSelectedItem
{
    get
    {
        return _yourSelectedItem;
    }
    set
    {
        NewFirstName = value.FirstName;
        _yourSelectedItem = value;
        RaisePropertyChanged("YourSelectedItem");
    }
}

猜这不是最好的方法:/

【问题讨论】:

  • 您是说ListView 更新但TextBox 值不更新?
  • 不,它工作正常(单击 ListView 项目 --> FirstName 和 LastName 根据选择填写 - 立即 --> 更新 textBox 中的文本 --> ListView 立即更新)。我想要做的是在我更新我的数据库之后更新源(ObservableCollection),所以如果出现错误,我可以坚持使用旧值。不幸的是,我的文本框直接绑定到我的 ListView,所以我想我必须创建一个新属性(请参阅我更新的问题)

标签: c# wpf mvvm


【解决方案1】:

我会这样做:

  1. 更新数据库。
  2. 要么从更新方法返回更新的数据实体,要么在更新后查询数据库以检索更新的数据实体。
  3. 使用新值更新应用程序中的对象。

我强烈建议在您的数据库和应用程序的类中都使用唯一标识符/ID,如果您还没有这样做的话。

此外,您需要在模型类上实现 INotifyPropertyChanged,因为更新 ObservableCollection 中的项目不会对您的视图产生任何影响,因为 ObservableCollection 仅在集合本身时引发通知更改,例如添加/删除,而不是在其成员中的属性更改时。

【讨论】:

  • 非常感谢您的详细回答.. 将根据您的回答更改我的代码:)
猜你喜欢
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2019-04-16
  • 1970-01-01
  • 2016-12-17
  • 2014-09-24
相关资源
最近更新 更多