【问题标题】:two views sharing one viewmodel listbox doesn't update共享一个视图模型列表框的两个视图不更新
【发布时间】:2015-05-23 07:31:09
【问题描述】:

我有两个窗口(视图),它们共享相同的视图模型。我使用一个窗口输入数据,第二个窗口根据输入窗口中一个组合框的值在 3 个不同的列表框(可观察集合)中对其进行排序。我遇到的问题是输入没有显示在列表框中。就像 observable 集合没有更新一样。

这是我在输入窗口中的代码

public partial class AddPerson : Window
{
    public NetworkViewModel MyViewModel;
    public AddPerson()
    {
        InitializeComponent();
        this.DataContext = new NetworkViewModel();
    }
}

在 xaml 中

<TextBox x:Name="tb_firstName"  Text="{Binding Path=FirstName, Mode=TwoWay}"/>
<ComboBox x:Name="cb_group"  ItemsSource="{Binding GroupLevel}"  SelectedItem="{Binding SelectedGroupLevel}"/>

在我拥有的 3 个列表框的显示窗口中

public partial class Display : Window
{
    public NetworkViewModel MyViewModel;
    public AddPerson()
    {
        InitializeComponent();
        this.DataContext = new NetworkViewModel();
    }
}

这是显示窗口的 xaml

<ListBox x:Name="lb1"  GotFocus="textBox1_visible" ItemsSource="{Binding NetworkList1}" dd:DragDrop.IsDragSource="True"
     dd:DragDrop.IsDropTarget="True" SelectedItem ="{Binding Path=SelectedItemGroup, Mode=TwoWay}" />

<ListBox x:Name="lb2"  GotFocus="textBox1_visible" ItemsSource="{Binding NetworkList2}" dd:DragDrop.IsDragSource="True"
     dd:DragDrop.IsDropTarget="True" SelectedItem ="{Binding Path=SelectedItemGroup, Mode=TwoWay}" />

这就是我的视图模型的样子

public class NetworkViewModel: INotifyPropertyChanged
{

    private ObservableCollection<Person> _networkList1 = new ObservableCollection<Person>();
    public ObservableCollection<Person> NetworkList1 //Binds with the listbox
    {
        get { return _networkList1; }
        set { _networkList1 = value; } 
    }

 private string _firstName;
 public string FirstName  
    {
        get { return this._firstName; }
        set { this._firstName = value; NotifyPropertyChanged("FirstName"); }
    }
 private string _group;
 public string Group  
    {
        get { return _group; }
        set { _group = value; NotifyPropertyChanged("Group"); }
    }

 public NetworkViewModel() 
    {
        AddPersonCommand = new RelayCommand(AddPerson);
    }

 private ICommand _addPersonCommand;
 public ICommand AddPersonCommand
    {
        get { return _addPersonCommand; }
        set { _addPersonCommand = value; }
    }

 public void AddPerson(object obj)
    {
        if (SelectedGroupLevel == "Primary")
        {

             NetworkList1.Add(new Person()
            {
                FirstName = this.FirstName,
                Group = this.Group,
            });
             MessageBox.Show("Person successfully added");
        }
        else if (SelectedGroupLevel == "Secondary")
        {
             NetworkList2.Add(new Person()
            {
                FirstName = this.FirstName,
                Group = this.Group,
            });
             MessageBox.Show("Person successfully added");
        }
     }

当我单击输入窗口中的添加按钮时,我可以在消息框中看到消息,这意味着数据已添加到可观察集合中,但我没有看到它显示,希望有人可以帮助我问题。我对 wpf 和 mvvm 非常熟悉。谢谢。

【问题讨论】:

    标签: c# wpf xaml mvvm listbox


    【解决方案1】:

    问题在于您使用视图模型的方式。您正在创建视图模型的两个单独实例,一个在 AddPerson 视图中,一个在 Display 视图中。当您在 AddPerson 视图中添加项目时,它会更新自己的视图模型,而不是显示视图的视图模型。

    您需要一种两种方式将更改从一个视图模型传递到另一个视图模型。

    【讨论】:

    • 我现在理解逻辑以及为什么它没有更新。但是我怎样才能达到我想要的。有没有可以看的示例代码?
    • @Phil 看看 mvvmlight。在这个实例中更容易创建一个向 2 个视图提供数据的 ViewModel
    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多