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。无论如何,谢谢你的回答。