Silverlight 使用RaisePropertyChanged更新列表框数据

Silverlight 使用RaisePropertyChanged更新列表框数据,silverlight,silverlight-4.0,mvvm-light,Silverlight,Silverlight 4.0,Mvvm Light,在我的silverlight应用程序中,我有一个带有列表框的视图: <ListBox Canvas.Left="12" Canvas.Top="72" Height="468" Name="invoiceList" Width="453" ItemsSource="{Binding ElementList}" > <ListBox.ItemTemplate> <DataTemplate>

在我的silverlight应用程序中,我有一个带有列表框的视图:

<ListBox Canvas.Left="12" Canvas.Top="72" Height="468" Name="invoiceList" Width="453" ItemsSource="{Binding ElementList}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" />
                </DataTemplate>
            </ListBox.ItemTemplate>
</ListBox>

它绑定到我的VM中的元素列表。问题是,当我使用Relay命令逐个添加新元素时:

public RelayCommand<Element> AddNewElement = new RelayCommand<Element>(NewElement(element));

   public void NewElement(Element element)
    {
        if(ElementList == null) ElementList = new List<Element>();
        if (element != null) ElementList.Add(element);
        RaisePropertyChanged("ElementList");
    }
public RelayCommand AddNewElement=new RelayCommand(NewElement(element));
公共无效新元素(元素)
{
如果(ElementList==null)ElementList=new List();
if(element!=null)ElementList.Add(element);
RaisePropertyChanged(“元素列表”);
}

listbox只更新一次,即它只显示集合的第一个元素,尽管ElementList中有更多的项

您需要绑定到ObservableCollection类型的列表,然后对列表集合的每次更新都会触发要更新的绑定

有关如何创建列表的可观察集合的示例:

public ObservableCollection<string> MyElements { get; set; }
public void FillList()
{
    List<string> testList = new List<string>() {"string1", "string2"};
    MyElements = new ObservableCollection<string>(testList);
}
viewmodel.cs

public class Window1ViewModel : ViewModelBase
{
    public ObservableCollection<string> MyStrings { get; set; }
    public RelayCommand AddExtraStringCommand { get; set; }

    public Window1ViewModel()
    {
        patient = new Patient() { BirthdayString = "21/11" };
        MyStrings = new ObservableCollection<string>() { "string1", "string2", "string3" };
        AddExtraStringCommand = new RelayCommand(AddExtraString);
    }

    public void AddExtraString()
    {
        MyStrings.Add("nog enen extra om: " + DateTime.Now);
    }
}
公共类Window1ViewModel:ViewModelBase
{
公共observeCollection MyStrings{get;set;}
公共RelayCommand AddExtraStringCommand{get;set;}
公共窗口1ViewModel()
{
患者=新患者(){BirthdayString=“21/11”};
myString=新的ObservableCollection(){“string1”、“string2”、“string3”};
AddExtraString命令=新的RelayCommand(AddExtraString);
}
public void AddExtraString()
{
添加(“nog enen额外om:+DateTime.Now”);
}
}

我不必触发RaisePropertyChanged来让它工作。也许您可以将代码检查到此代码示例。

您需要绑定到ObservableCollection类型的列表,然后对列表集合的每次更新都会触发要更新的绑定

有关如何创建列表的可观察集合的示例:

public ObservableCollection<string> MyElements { get; set; }
public void FillList()
{
    List<string> testList = new List<string>() {"string1", "string2"};
    MyElements = new ObservableCollection<string>(testList);
}
viewmodel.cs

public class Window1ViewModel : ViewModelBase
{
    public ObservableCollection<string> MyStrings { get; set; }
    public RelayCommand AddExtraStringCommand { get; set; }

    public Window1ViewModel()
    {
        patient = new Patient() { BirthdayString = "21/11" };
        MyStrings = new ObservableCollection<string>() { "string1", "string2", "string3" };
        AddExtraStringCommand = new RelayCommand(AddExtraString);
    }

    public void AddExtraString()
    {
        MyStrings.Add("nog enen extra om: " + DateTime.Now);
    }
}
公共类Window1ViewModel:ViewModelBase
{
公共observeCollection MyStrings{get;set;}
公共RelayCommand AddExtraStringCommand{get;set;}
公共窗口1ViewModel()
{
患者=新患者(){BirthdayString=“21/11”};
myString=新的ObservableCollection(){“string1”、“string2”、“string3”};
AddExtraString命令=新的RelayCommand(AddExtraString);
}
public void AddExtraString()
{
添加(“nog enen额外om:+DateTime.Now”);
}
}

我不必触发RaisePropertyChanged来让它工作。也许您可以查看此代码示例中的代码。

非常感谢您几乎解决了我的问题!但在MyElements.Add(“string”)之后,我还是不得不调用RaisePropertyChanged(“PropertyName”),因为Add方法没有触发要更新的绑定,现在它工作正常。我添加了一个工作代码示例。试着用这个检查你的代码,因为这是在meHey的一个测试项目中工作!在我的程序中,我正在以您提供的方式做所有事情,但我仍然必须使用RaisePropertyChanged。非常感谢您几乎解决了我的问题!但在MyElements.Add(“string”)之后,我还是不得不调用RaisePropertyChanged(“PropertyName”),因为Add方法没有触发要更新的绑定,现在它工作正常。我添加了一个工作代码示例。试着用这个检查你的代码,因为这是在meHey的一个测试项目中工作!在我的程序中,我以您提供的相同方式执行所有操作,但我仍然必须使用RaisePropertyChanged。