C# 将multi-listbox itemsouce与usercontrol的1个ObserverableCollection绑定

C# 将multi-listbox itemsouce与usercontrol的1个ObserverableCollection绑定,c#,wpf,C#,Wpf,我有两个列表框定义如下: <ListBox x:Name="RemoteListBox" HorizontalAlignment="Right" Margin="0,88.5,8,0" Width="382.5" HorizontalContentAlignment="Stretch" ItemsSource ="{Binding RemoteItemsList}"

我有两个列表框定义如下:

<ListBox x:Name="RemoteListBox" HorizontalAlignment="Right" Margin="0,88.5,8,0" 
             Width="382.5" 
             HorizontalContentAlignment="Stretch"                 
             ItemsSource ="{Binding RemoteItemsList}"                                 
             SelectedIndex="0">            
    </ListBox>
    <ListBox x:Name="LibraryListBox" 
             Margin="4.5,88.5,437,0"
             HorizontalContentAlignment="Stretch"
             ItemsSource="{Binding LibraryItemsList}"                 
             SelectedIndex="0">                      
    </ListBox>
var listMotion = new ObservableCollection<MotionTitleItem>();                
foreach (MotionInfo info in listMotionInfo)
     {
          var motionTitleItem = new MotionTitleItem();                    
          listMotion.Add(motionTitleItem);                    
     }
 viewModel.RemoteItemsList = listMotion;
 viewModel.LibraryItemsList = listMotion;

我的视图模型

    private ObservableCollection<MotionTitleItem> _remoteItemsList;
    public ObservableCollection<MotionTitleItem> RemoteItemsList
    {
        get { return _remoteItemsList; }
        set
        {
            _remoteItemsList = value;
            NotifyPropertyChanged("RemoteItemsList");
        }
    }
    private ObservableCollection<MotionTitleItem> _libraryItemsList

    public ObservableCollection<MotionTitleItem> LibraryItemsList
    {
        get { return _libraryItemsList; }
        set
        {
            _libraryItemsList = value;
            NotifyPropertyChanged("LibraryItemsList");
        }
    }
private-observeCollection\u-remoteItemsList;
公共可观察收集远程项目列表
{
获取{return\u remoteItemsList;}
设置
{
_remoteItemsList=值;
NotifyPropertyChanged(“RemoteItemsList”);
}
}
私人可观察收集(图书馆项目列表)
公共可观测收集图书馆项目列表
{
获取{return\u libraryItemsList;}
设置
{
_libraryItemsList=值;
NotifyPropertyChanged(“LibraryItemsList”);
}
}
我将两个ListBox ItemSource与下面定义的ObserverableCollection绑定:

<ListBox x:Name="RemoteListBox" HorizontalAlignment="Right" Margin="0,88.5,8,0" 
             Width="382.5" 
             HorizontalContentAlignment="Stretch"                 
             ItemsSource ="{Binding RemoteItemsList}"                                 
             SelectedIndex="0">            
    </ListBox>
    <ListBox x:Name="LibraryListBox" 
             Margin="4.5,88.5,437,0"
             HorizontalContentAlignment="Stretch"
             ItemsSource="{Binding LibraryItemsList}"                 
             SelectedIndex="0">                      
    </ListBox>
var listMotion = new ObservableCollection<MotionTitleItem>();                
foreach (MotionInfo info in listMotionInfo)
     {
          var motionTitleItem = new MotionTitleItem();                    
          listMotion.Add(motionTitleItem);                    
     }
 viewModel.RemoteItemsList = listMotion;
 viewModel.LibraryItemsList = listMotion;
var listMotion=新的ObservableCollection();
foreach(listMotionInfo中的MotionInfo)
{
var motionTitleItem=新的motionTitleItem();
添加(motionTitleItem);
}
viewModel.RemoteItemsList=listMotion;
viewModel.LibraryItemsList=listMotion;
MotionTitleItem是一个自定义用户控件。 我的问题是,只有第一个带有ItemSource绑定和RemoteListItem的列表框会在UI中显示该项,而另一个则不会。 如果将两个ListBox ItemSource与2个ObserverableCollection绑定,则问题已解决:

var listMotion = new ObservableCollection<MotionTitleItem>();
var listMotion2 = new ObservableCollection<MotionTitleItem>();
foreach (MotionInfo info in listMotionInfo)
     {
           var motionTitleItem = new MotionTitleItem();
           listMotion.Add(motionTitleItem);
           var motionTitleItem2 = new MotionTitleItem();
           listMotion2.Add(motionTitleItem2);
      }
 viewModel.RemoteItemsList = listMotion;
 viewModel.LibraryItemsList = listMotion2;
var listMotion=新的ObservableCollection();
var listMotion2=新的ObservableCollection();
foreach(listMotionInfo中的MotionInfo)
{
var motionTitleItem=新的motionTitleItem();
添加(motionTitleItem);
var motionTitleItem2=新的MotionTitleItem();
listMotion2.Add(motionTitleItem2);
}
viewModel.RemoteItemsList=listMotion;
viewModel.LibraryItemsList=listMotion2;

有人能给我解释一下第一个场景问题的重点在哪里吗?

我不知道你为什么要用两个临时列表来解决这个问题。您可以直接将项目添加到可观察集合中。试试这个:

foreach (MotionInfo info in listMotionInfo)
 {
       viewModel.RemoteItemsList.Add(info);
       viewModel.LibraryItemsList.Add(info);
  }
下面,我尝试为您创建解决方案。 我假设模型是运动的

public class MotionTitleItem 
{
string _name = string.Empty;

public string Name
{
  get { return _name; }
  set
  {
    _name = value;
    OnPropertyChanged("Name");
  }
}


public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string propertyName)
{
  try
  {
    PropertyChangedEventHandler eventHandler = this.PropertyChanged;

    if (null == eventHandler)
      return;
    else
    {
      var e = new PropertyChangedEventArgs(propertyName);
      eventHandler(this, e);
    }
  }
  catch (Exception)
  {

    throw;
  }
}
}

此应用程序的我的视图模型是:

 public class MotionTitleItemViewModel : INotifyPropertyChanged
 {
ObservableCollection<MotionTitleItem> _remoteItemsList = new ObservableCollection<MotionTitleItem>();

public ObservableCollection<MotionTitleItem> RemoteItemsList
{
  get { return _remoteItemsList; }
  set { _remoteItemsList = value; }
}

ObservableCollection<MotionTitleItem> _libraryItemsList = new ObservableCollection<MotionTitleItem>();

public ObservableCollection<MotionTitleItem> LibraryItemsList
{
  get { return _libraryItemsList; }
  set { _libraryItemsList = value; }
}

public MotionTitleItemViewModel()
{
  MotionTitleItem motion;
  for (int i = 0; i < 10; i++)
  {
    motion = new MotionTitleItem();
    motion.Name = "Name " + i.ToString();

    this.LibraryItemsList.Add(motion);
    this.RemoteItemsList.Add(motion);
  }     
}

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(string propertyName)
{
  try
  {
    PropertyChangedEventHandler eventHandler = this.PropertyChanged;

    if (null == eventHandler)
      return;
    else
    {
      var e = new PropertyChangedEventArgs(propertyName);
      eventHandler(this, e);
    }
  }
  catch (Exception)
  {

    throw;
  }
} }
这个代码对我有用。 下面是输出的屏幕截图

如果您觉得这个答案有用,请投票。


玩得开心

我刚刚尝试将两个
列表框
绑定到同一个
可观察集合
。为我工作。在输出窗口中查找绑定错误,如果存在,它会说什么?另外,如果要将它们绑定到同一个集合,为什么视图模型中甚至需要两个属性?只需将它们绑定到同一个属性。如果为视图模型发布代码,可能会有所帮助。绑定没有错误。我想我的问题是关于customusercontrol的可观测性。如果我将system usercontrol改为TextBlock,它就会工作。谢谢你的建议。我将编辑我的代码。请查看更多代码(查看模型和视图)。此外,作为参考,在WPF中,
UserControls
CustomControls
不同。我想你对术语有点困惑。我添加了视图模型。除了不需要使用
observedcollections
进行整个
NotifyPropertyChanged
kaboodle之外,你目前发布的内容没有什么错。每次向
ObservableCollection
添加项目时,它都会更新任何绑定。我使用临时列表用于另一个目的,因此我使用此列表分配给2“ObservableCollection”。如果我像你一样更改我的“ListBox.ItemPlate”,它就会起作用。但我的“MotionTitleItem”用户控件无法将模板更改为textblock。无论如何,谢谢你的回答。