我的团队和我开始计划开发一个模块化的应用程序,它可能会多目标WPF和Silverlight.
我个人有一些使用旧版PRISM来使用MVVM模式构建复合Silverlight应用程序的经验.我们当时并不熟悉MEF来处理各种模块依赖关系,因此我们没有使用它.
我们没有与任何特定框架结婚,但想要使用其中一个更大的玩家.因此,我们开始研究Caliburn/Caliburn Micro,Prism,MVVM Light和Reactive UI.
我读到的模块化大部分内容都表明PRISM和MEF可以处理这一过程.由于我还在围绕其中的一些,我不确定我是否缺少一些明显的选择.我能够在Caliburn Micro和MEF上找到这篇文章.
任何人都可以指点我使用其他一些框架编写复合应用程序的类似文章,类似于PRSIM使用区域等的方式吗?理想情况下,我想限制所需框架的数量,同时提供最大的灵活性.我们不反对采用"最佳"方法并使用例如MEF/PRISM来处理View管理的合成和MVVM Light等; 但为什么在1时会使用2?
我们在新的Silverlight项目上使用Caliburn.Micro,并且每个人都工作得很好.内置约定将按钮单击事件绑定到viewModel,但我不确定在datagrids和comboboxes上处理selectionChanged事件的最佳方法是什么.
目前,我绑定到所选项目并调用自定义逻辑,但我觉得这有点代码味道,我应该分离属性和selectedChange事件的设置.但是,如果我将它们分开,如何通过命令将选择更改事件绑定到我的viewModel?还是一个EventTrigger?或者下面的代码是否可以接受?这是一个很小的变化,但我到处都是这个逻辑.
private Foo _selectedFoo;
public Foo SelectedFoo
{
get
{
return _Foo;
}
set
{
if (_Foo != null && _Foo.Equals(value)) return;
_Foo = value;
NotifyOfPropertyChange("SelectedFoo");
NotifyOfPropertyChange("CanRemove");
LoadRelatedBars();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用带有WPF的Caliburn.Micro学习.如何在视图中添加多个视图?
<Window x:Class="ProjectName.Views.MainView"
...>
<Grid>
<views:MyControlView />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
另一个视图,使用viewmodel:MyControlViewModel
<UserControl x:Class="ProjectName.Views.MyControlView"
...>
<Grid>
...
</Grid>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
如果我只是添加视图,它将不会检测到它具有具有适当名称的viewmodel.我怎么能把它绑在上面呢?
我已尝试使用不同的bootstrappers并使用类似cal:Bind.Model ="path/classname/merge of the two".试图将其添加到主视图和usercontrol(MyControlView).我非常感谢有关此事的任何帮助.我几乎卡住了,我真的想用Caliburn.Micro :)
最好的问候,钻石鱼
编辑:我仍然无法让它工作,问题似乎是在引导程序或其他东西.但只是为了澄清,这是我的代码,我正在运行testproject.
MainView xaml:
<Window x:Class="Test.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
xmlns:views="clr-namespace:Test.Views"
Title="MainWindow" Height="360" Width="640">
<Grid>
<views:MyControlView />
</Grid>
Run Code Online (Sandbox Code Playgroud)
MainViewModel代码:
public partial class MainViewModel : PropertyChangedBase
{
}
Run Code Online (Sandbox Code Playgroud)
MyControlView xaml:
<UserControl x:Class="Test.Views.MyControlView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"
cal:Bind.Model="Test.MyControlViewModel"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBlock Text="{Binding MyProp}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
MyControlView代码:
public class MyControlViewModel : PropertyChangedBase
{
public string MyProp
{
get …Run Code Online (Sandbox Code Playgroud) 我已经将Prism 2.0用于个人项目几个月了.我最近听说过Caliburn,我想知道是否有令人信服的理由让我考虑一下.
我喜欢Prism的动态模块加载功能.我打算为我的应用程序构建模块,并希望能够以模块化方式部署它们.Caliburn也可以吗?
Caliburn比Prism有什么优势?
(我读到Prism还将在2010年9月之前推出一个新版本,它将利用.Net 4.0.并且我的应用程序也可以灵活地进行更新.)
我正在尝试在ListBox ItemTemplate中获取上下文菜单以调用父视图模型上的方法,并将作为参数单击的项目传入.我有这个工作项目模板中的其他按钮,但对于上下文菜单,它似乎失败了.
我有以下xaml(缩写为清晰):
<ListBox>
<ListBox.GroupStyle>
<GroupStyle>
...
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ContextMenu>
<ContextMenu Name="cm">
<MenuItem Header="Open"
cal:Message.Attach="Open($dataContext)">
</MenuItem>
</Grid.ContextMenu>
<TextBlock VerticalAlignment="Center" >
.. text..
</TextBlock>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,这与视觉树不同的事实有关,因此Caliburn无法可靠地解决方法.我确定这是一个常见问题,我尝试了一些我在网上发现的东西,但似乎没有任何效果.
有任何想法吗??
我正在寻找一篇比较MVVM Light,Caliburn Micro,Prism和任何其他Silverlight/WPF/WP7框架的好文章.我已经看过一些关于它们的好文章,但没有任何真正使它们相互对立的文章.有什么建议?
我在WinRT应用程序中使用Caliburn.Micro
这是我的主要VM:
public class MainViewModel : Conductor<Screen>
{
protected override void OnActivate()
{
if (ActiveItem == null)
{
ActivateItem(
ViewModelLocator.LocateForViewType(typeof(NewsFeedView)) as Screen);
}
base.OnActivate();
}
}
Run Code Online (Sandbox Code Playgroud)
这里我使用指挥因为我想在ContentControl中加载不同的控件,但现在我只有这个代码.这是我在主视图中的内容控件:
<ContentControl x:Name="ActiveItem" Grid.Column="1" Grid.Row="1" />
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,一切正常,MainViewModel.Activate被调用并ActiveItem设置NewsFeedViewModel并ContentControl加载NewsFeedView.
问题:
当我在导航NewsFeedView控制,另一种观点认为使用NavigationService.NavigateToViewModel方法,然后在视图中使用NavigationService.GoBack,我就要回MainView在那一刻,当MainViewModel.Activate被称为ActiveItem没有null,但ContentControl.Content就是null.我已经尝试过使用View.Model附属物ContentControl但没有运气,如何让它重新绑定?
编辑: 最后我在Caliburn设置记录器,看看会发生什么,我发现一个错误 - 当导航后加载MainView这个事件发生时:
Attaching ***.Views.MainView to ***.ViewModels.MainViewModel.
ViewModel bound on ActiveItem.
Using …Run Code Online (Sandbox Code Playgroud) 有人知道Caliburn或Caliburn Micro框架示例的良好代码示例,用于说明使用DataGrid项目的路由操作吗?
我正在尝试通过拖放功能上传文件.我成功地完成了UI工作,但是我无法访问在后端丢弃的对象.如果我在代码后面做的话,我能够成功地抓住对象,但我正在尝试采用MVVM方法.
AttachmentView.xaml
Cal:Message.Attach="[Drop] = [SaveFile($eventArgs)]"
Run Code Online (Sandbox Code Playgroud)
AttachmentViewModel.cs
public virtual async void SaveFile(DragEventArgs e)
{
var fileStream = new FileStream([File name goes here], FileMode.Open, FileAccess.Read);
}
Run Code Online (Sandbox Code Playgroud)
我试过EventArgs,我找不到文件对象属性.测试代码时,DragEventArgs为null.
代码背后的工作解决方案
AttachmentView.xaml.cs
private void ImagePanel_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
// Note that you can have more than one file.
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
// Assuming you have one file that you care about, pass it off to whatever
// handling code you have defined.
Upload(files);
}
}
Run Code Online (Sandbox Code Playgroud) caliburn ×10
wpf ×5
c# ×3
mvvm ×3
prism ×3
silverlight ×3
mvvm-light ×2
.net ×1
action ×1
contextmenu ×1
datagrid ×1
mef ×1
viewmodel ×1
winrt-xaml ×1