【问题标题】:WPF how to control the ListCollectionView binding method?WPF如何控制ListCollectionView绑定方法?
【发布时间】:2012-05-12 10:45:11
【问题描述】:

我有一个简单的 ObservableCollection 列表,我使用 ListCollectionView 绑定到表单。

我想控制绑定方法的问题。 意味着只有当我按下 OK 按钮时,属性才会改变。

现在,如果我更改“名字”并导航,那么该值将被保存。

例如,如果我将“名字”更改为 XXX 然后导航下一个然后返回,我会看到 XXX 而不是 x...

这是 MainWindow.xaml:

public partial class MainWindow : Window
{
    private ListCollectionView view;

    private PersonRepository _personRepository;


    public MainWindow()
    {
        InitializeComponent();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _personRepository = new PersonRepository();

        this.DataContext = _personRepository.Persons;

        view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.DataContext);
    }


    private void BackButton_Click(object sender, RoutedEventArgs e)
    {
        view.MoveCurrentToPrevious();

        view.Refresh();
    }

    private void OkButton_Click(object sender, RoutedEventArgs e)
    {

    }

    private void NextButton_Click(object sender, RoutedEventArgs e)
    {
        view.MoveCurrentToNext();
    }
}

而 Person 类是:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Age { get; set; }
    public string Description { get; set; }
}

存储库是带有虚拟数据的 ObservableCollection... 我的 xaml 字段绑定为:Text="{Binding FirstName, UpdateSourceTrigger=Explicit}"

【问题讨论】:

    标签: wpf binding listcollectionview


    【解决方案1】:

    您可以让Person 实现IEditableObject。然后,您可以从 OK 按钮调用 EndEdit,但从其他导航按钮调用 CancelEdit

    也就是说,我会觉得这个界面不直观。

    【讨论】:

    • @kaycee:呃,我想你误解了我的评论。我是说无论你如何实现它,这个接口都是不直观的。
    【解决方案2】:

    我会通过使用 BindingGroup 来做到这一点。我会选择一个容器,例如一个 GroupBox,或者简单的 Grid,它布置了编辑 Person 类的控件,确保容器包含所有这些控件并且当前 Person 对象是它的 DataContext,并在它的 XAML 定义中指定一个 BindingGroup。

    这会导致当前 Person 的所有 Bindings 上的默认 UpdateSourceTrigger 从 LostFocus 更改为 Explicit。这意味着您用于编辑 Person 对象的控件不会自动更新其绑定属性,而是会等到您在 BindingGroup 上调用 CommitEdit,这显然是您按下 OK 按钮时将执行的操作。正如 Kent 已经建议的那样,您可以在导航按钮中调用 CancelEdit,以便在您不按 OK 时防止更新当前 Person。逻辑与 IEditableObject 相同,只是您不必更改 Person 类,而是使用 BindingGroup 的行为来实现您想要的。

    【讨论】:

      猜你喜欢
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多