我正在尝试使用Caliburn.Micro来绑定嵌套ListBox
的视图模型但我被卡住了。
我有一个列表工作区,分为两个部分,一组包含该工作区不同部分中的项目的组列表我想显示一个组或组中项目的详细信息,具体取决于SelectedItem
的内容。我是Caliburn.Micro的新手并查看了文档和样本,但不知道如何连接点。具体来说,我试图在Caliburn.Micro.HelloScreens样本之后对此进行建模。我到目前为止的代码:
ViewModel:
public class AnalyzerGroupWorkspaceViewModel : Conductor<AnalyzerGroupWorkspaceViewModel>, IWorkspace
{
private Selected selected = Selected.AnalyzerGroup;
private const string name = "Analyzers";
public AnalyzerGroupWorkspaceViewModel(
IMappingEngine fromMapper,
IRepository<Model.AnalyzerGroup> analyzerGroups)
{
AnalyzerGroups = new ObservableCollection<IAnalyzerGroupViewModel>(analyzerGroups.GetAll().Select(fromMapper.Map<Model.AnalyzerGroup,AnalyzerGroupViewModel>));
}
public ObservableCollection<IAnalyzerGroupViewModel> AnalyzerGroups { get; private set; }
public string Name { get { return name; } }
public Selected Selected
{
get { return selected; }
set
{
if (value == selected) return;
selected = value;
NotifyOfPropertyChange(() => Selected);
}
}
private IConductor Conductor { get { return (IConductor) Parent; } }
public void Show()
{
var haveActive = Parent as IHaveActiveItem;
if (haveActive != null && haveActive.ActiveItem == this)
{
DisplayName = name;
Selected = Selected.AnalyzerGroup;
}
else
{
Conductor.ActivateItem(this);
}
}
}
观点:
<UserControl x:Class="Philips.HHDx.SSW.AnalyzerGroup.AnalyzerGroupWorkspaceView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="http://www.caliburnproject.org">
<DockPanel>
<GroupBox Header="AnalyzerGroups" DockPanel.Dock="Top">
<ListBox x:Name="AnalyzerGroups">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name}" />
<ListBox x:Name="Analyzers">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Id }"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</GroupBox>
<GroupBox Header="Details">
<ContentControl cal:View.Context="{Binding Selected, Mode=TwoWay}"
cal:View.Model="{Binding}"
VerticalContentAlignment="Stretch"
HorizontalContentAlignment="Stretch"/>
</GroupBox>
</DockPanel>
</UserControl>
接下来,我有两个显示组或项目详细信息的UserControl
。
我的具体问题是如何使用两个SelectedItem
的{{1}}属性修改ListBoxes
属性,以便在显示Selected
详细信息和AnalyzerGroup
之间切换细节?
答案 0 :(得分:1)
我找到了上述问题的解决方案,该解决方案由四部分组成:
IsSelected
属性(通知更改)
IsSelected
的{{1}}属性绑定到相应ViewModels的ListBox.ItemContainerStyle
属性IsSelected
附加到'外部'Message
并使用ListBox
参数$eventArgs
对应的方法,并使用Message
的{{1}}属性设置AddedItems
属性设置{上一个eventArgs
到SelectedViewModel
然后代码变为:
ViewModel:
IsSelected
观点:
SelectedViewModel
答案 1 :(得分:0)
你的具体问题的答案是肯定的,你可以。
在UserControl的ViewModel上。您创建一个属性,该属性是两个详细信息之一的ViewModel。
public interface IAnalyzerViewModel
{
}
接下来,为Analyzer
和AnalyzerGroup
视图的视图创建两个ViewModel。
public class AnalyzerGroupViewModel : IAnalyzerViewModel
{
}
public class AnalyzerViewModel : IAnalyzerViewModel
{
}
接下来,在UserControl的ViewModel中创建一个实现INPC
或PropertyChangedBase
Caliburn Micro
的属性。
public class MainViewModel :
{
private IAnalyzerViewModel _analyzerViewModel;
public IAnalyzerViewModel SelectedViewModel { get { return _analyzerViewModel; } set { _analyzerViewModel = value; OnPropertyChanged(() => SelectedViewModel); }
//Hook up the selected item changed event of your listbox and set the appropriate ViewModel to show, so if you either want to show the AnalyzerGroup or AnalyzerView.
}
最后,只需将MainView
更新为
<ContentControl x:Name="SelectedViewModel"
VerticalContentAlignment="Stretch"
HorizontalContentAlignment="Stretch"/>
Caliburn
将连接相应的绑定和东西,并为相关的ViewModel提取View,并且只要名称匹配,Name约定部分将自动将其映射到其datacontext的任何公共属性。