- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Caliburn Micro
在我的项目中,我有许多用户控件和他们的 View 模型继承自 PropertyChangedBase
,我希望将此 UserControl 添加到我的 ShellView 中的 Canvas 中。我不想使用 IWindowManager
从显示 Windows 而不是我希望它们被添加到 Canvas 中。
请帮忙。我怎样才能做到这一点。
最佳答案
如果您使用 ContentControl
在您的ShellView
您可以 Hook 到 Caliburn.Micro 的 View-ViewModel 绑定(bind)过程。
我假设在你的 ShellViewModel
你有一堆暴露的属性类型 ViewModel
.如果您放置 ContentControl
在您的 ShellView
(如果这是您希望用来布局您的 Shell 的容器,则它可以在/作为 Canvas
的子项),然后用您的 ShellViewModel
中的属性名称命名该控件你希望它被绑定(bind),然后 Caliburn 的 ViewModelBinder
剩下的会为你做。
例如,假设您有一个名为 FizzViewModel
的 VM和一个名为 FizzView
的匹配 View (这只是一个 UserControl
)并且你想要 FizzView
出现在您的ShellView
您可以执行以下操作...
脱衣舞ShellViewModel
public class ShellViewModel : Screen, IShell
{
public ShellViewModel(FizzViewModel theFizz)
{
TheFizz = theFizz;
}
public FizzViewModel TheFizz { get; set; }
}
ShellView
<UserControl x:Class="ANamespace.ShellView">
<Canvas>
<ContentControl x:Name="TheFizz"></ContentControl>
</Canvas>
</UserControl>
ContentControl
被命名为 TheFizz,它将被 Caliburn 绑定(bind)到您的 VM 上具有该名称的属性(类型之一
FizzViewModel
)
UserControl
在您的
ShellView
上使用他们的真实类型,您让 Caliburn 通过约定为您完成工作(这意味着如果您只需添加更多接口(interface)间接,就可以轻松换出 TheFizz 类型)。
DataTemplate
Caliburn 使用如下所示
<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro">
<ContentControl cal:View.Model="{Binding}"
VerticalContentAlignment="Stretch"
HorizontalContentAlignment="Stretch" />
</DataTemplate>
ContentControl
,正如我上面讨论的那样,它有一些优点。基本上,这将允许 Caliburn 提供
DataTemplateSelector
喜欢你的
ItemsControl
中的项目的行为.因此,您可以将不同类型的虚拟机添加到您的
ItemsControl
集合中。绑定(bind)到此默认值
DataTemplate
将解析用于显示它的 View 类型。以下演示了一个非常简单的示例,说明如何实现您想要的。
BindableCollection
命名项目
[Export(typeof(IShell))]
public class ShellViewModel : IShell
{
public ShellViewModel()
{
Items = new BindableCollection<Screen>();
_rand = new Random();
}
public BindableCollection<Screen> Items { get; set; }
private Random _rand;
public void AddItem()
{
var next = _rand.Next(3);
var mPosition = System.Windows.Input.Mouse.GetPosition(App.Current.MainWindow);
switch (next)
{
case 0:
{
Items.Add(new BlueViewModel
{
X = mPosition.X,
Y = mPosition.Y,
});
break;
}
case 1:
{
Items.Add(new RedViewModel
{
X = mPosition.X,
Y = mPosition.Y,
});
break;
}
case 2:
{
Items.Add(new GreenViewModel
{
X = mPosition.X,
Y = mPosition.Y,
});
break;
}
default:
break;
}
}
}
public abstract class SquareViewModel : Screen
{
public double X { get; set; }
public double Y { get; set; }
}
public class BlueViewModel : SquareViewModel
{
}
public class RedViewModel : SquareViewModel
{
}
public class GreenViewModel : SquareViewModel
{
}
<Window x:Class="WpfApplication2.ShellView"
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">
<Grid >
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<ItemsControl x:Name="Items"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas cal:Message.Attach="[Event MouseLeftButtonUp] = [Action AddItem()]"
Background="Transparent"></Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Path=X}" />
<Setter Property="Canvas.Top" Value="{Binding Path=Y}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Grid>
</Window>
UserControl
的示例将用于显示
GreenViewModel
,再创建 2 个,将名称更改为
RedView
和
BlueView
并适本地设置背景以使演示工作。
<UserControl x:Class="WpfApplication2.GreenView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="30"
Height="30">
<Grid Background="Green"></Grid>
</UserControl>
Canvas
上创建彩色方 block 。根据鼠标点击的位置,你的外壳。我认为你应该能够接受这个并将其扩展到你的需要。
关于wpf - 将 Caliburn Micro Screen(UserControl) 添加到 WPF MVVM 中的 Canvas ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10481927/
所以我在 Caliburn.Micro 上摆弄了一下,突然发现了一些有趣的东西。 我有一个名为 Maximum 的 ViewModel 属性,类型为 int,通过命名约定与 CM 自动绑定(bind)
如果我的 View 中有一个名为 Save 的按钮,那么我可以将 Save 属性添加到我的 ViewModel,Caliburn.Micro 会自动将它绑定(bind)到我的按钮的内容。例如: pub
我将 ViewModels 绑定(bind)到 ContentControls 并让 Caliburn 负责创建和绑定(bind) View 。但是,我想根据我绑定(bind)的 ContentCon
我一直在尝试将 Caliburn.Micro MVVM 框架集成到我处于中间位置的 C# WPF 项目中。 我目前只有三个 View 模型: ShellViewModel -(带有 ContentCo
Caliburn.Micro 是否有与 Catel's 类似的功能? [ExposeAttribute] ? 有没有其他方法可以减轻 Caliburn.Micro 中传递属性的工作? (即模型中的属性
我这样做: 问题是,这同时是主窗口上定义的主导体,我用它控制通过其他窗口的导航,所以我不能从 MetroWindow 继承,至少尝试更改 ViewModel 中的标题: public class S
我知道,没有办法直接在 Amazon 上从 t1.micro 迁移到 t2.micro。 那么,它会工作吗: 从当前 t1 中分离 EBS 卷 创建新的 t2.micro 实例 将 EBS vol 附
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我已在 MongoDb 配置文件中启用分析。 profile=2 slowms=5 mongodb 日志包含所有耗时超过 5 毫秒的查询(奇怪,我认为 profile=2 意味着记录所有查询)。 对于
我试图弄清楚如何成功地让 Caliburn Micro 在 Windows Phone 8.1 应用程序中从一个页面导航到另一个页面。 我的第一页加载得很好,正如我的 App 类中所指定的: prot
我尝试使用 Google 的 UI 在我的集群中启动一个新的 f1-micro 节点,但它默默地失败了。所以我决定使用 gcloud 运行它,看看它是否提供了更多细节 所以我运行了以下 gcloud
我正在使用 Arduino Micro 在我拥有的前端触发特定事件。然而,出于某种原因,一些关键组合只是随机触发。发生这种情况时,我什至没有接触 arduino。 我已经设置好了,当你按下一个按钮时,
我刚刚开始开发一个简单的 Restful 服务。我的文件夹结构如下: root - /api --/api/customers.php 例如,在浏览器中我打算调用http://domain/api/c
我有一些包含一定数量不同字符串的文件(大约 100.000 个取自产品)。需要找出处理该文件中每个字符串的函数的 99%、99.9%。 我尝试使用jmh来编写基准测试。但是,我只能找到批处理函数(处理
有没有办法在android中检测micro sd卡?我知道 Environment 类提供了外部存储的详细信息。但它只是提供了内置 SD 卡的详细信息。有办法解决吗? 最佳答案 您可以使用 isExt
问题是关于将 go-micro 包装器用作单独的服务 - 如果有人知道如何正确使用它,请告诉我。我的例子 - authWrapper,所以所有的 api 服务都应该能够使用它,它应该通过标准服务发现来
我有 Angular 6 微前端应用程序。它在主应用程序中有 4 个不同的应用程序。我如何在这些应用程序之间实现路由。我如何在主应用程序(我在主应用程序中有很多子路由)和子应用程序中实现路由。我正在使
我正在开发一个使用 Caliburn Micro 的 WPF 项目。我遇到了一个问题,即第二次打开 View 时, View 中的控件没有得到更新。第一次数据绑定(bind)工作正常。 当我第二次调用
在我的 WPF Caliburn.Micro 应用程序中,我有一个 TabControl。我希望能够根据需要关闭标签。我在这里找到了一种方法: http://devlicio.us/blogs/rob
我有一个使用WPF应用程序的场景,该应用程序托管一些带有其视图模型的视图(用户控件),这些视图模型是MEF在其插件文件夹中导出的部件。该应用程序将其数据与配置文件一起加载,该文件还指示应在可用零件中导
我是一名优秀的程序员,十分优秀!