我如何使用MVVM Light让两个视图模型相互通信.我知道如何使用messenger类和注册等.这是我的场景
A Settings View ---> a Settings View Model
.
.
.
A MainPage View ---> A MainPage ViewModel
Run Code Online (Sandbox Code Playgroud)
如果设置视图中的某些内容发生变化,它将回复到"设置视图模型".那么我希望设置视图模型与MainPage视图模型进行通信,了解更改的内容.然后,MainPage ViewModel将告诉View.
我一直在阅读Mark Seeman关于.NET中依赖注入的书,我很难在WPF应用程序中配置组合根.
我的容器将在应用程序启动方法中注册:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
var container = new Container();
container.Configure(r =>
{
r.For<IAccountServices>().Use<AccountServicesProxy>();
r.For<MainWindow>().Use<MainWindow>();
});
}
Run Code Online (Sandbox Code Playgroud)
这有意义,因为应用程序启动代表我的组合根.
我的应用程序中的WPF窗口基于视图模型.视图模型使用构造函数注入.例如,我可以通过注入实现来构成视图模型IAccountServices.
在创建主窗口时,我可以在OnStartup方法中执行以下操作:
var mainWindow = container.GetInstance<MainWindow>();
mainWindow.Show();
Run Code Online (Sandbox Code Playgroud)
一旦我进入主窗口,我可能想要打开另一个窗口.到目前为止,我已经能够提出一种方法,即创建一个窗口工厂并请求窗口工厂解析窗口的实例.我必须确保窗口工厂在每个可能需要打开新窗口的视图模型中都可用.在我看来,这与在我的应用程序中传递IoC容器一样糟糕(服务定位器反模式会浮现在脑海中).
这种方法对你来说是否正确?我的直觉告诉我这是错的,但我还没有想出一个更好的方法来实现这个目标.
我通过命名空间使用WPF Charting ToolKit:
xmlns:ChartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:VisualizationToolkit="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
Run Code Online (Sandbox Code Playgroud)
我有一个图表控件,在每次Lineseries绘图时我会生成一个随机颜色.我删除数据点标记并使用以下样式着色
<Style x:Key="LineDataPointStyle"
TargetType="ChartingToolkit:LineDataPoint">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Width" Value="NaN"/>
<Setter Property="Height" Value="NaN"/>
<Setter Property="Background"
Value="{Binding RelativeSource={RelativeSource Self},
Converter={StaticResource ColorBrushConverter}}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ChartingToolkit:LineDataPoint">
<Grid x:Name="Root" Opacity="0"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
通过LineSeries定义
<ChartingToolkit:LineSeries Title="{Binding DisplayName}"
AnimationSequence="FirstToLast"
SnapsToDevicePixels="True"
DataPointStyle="{StaticResource LineDataPointStyle}"
ItemsSource="{Binding Data}"
IndependentValueBinding="{Binding X}"
DependentValueBinding="{Binding Y}"/>
Run Code Online (Sandbox Code Playgroud)
现在,这工作正常,但图例标记显示的颜色与我为其生成的随机颜色不同LineSeries.我希望为它LineSeries和它Lineseries自己的图例项目显示相同的颜色.所以,我将传说项目设置如下
<Style x:Key="TestSuiteLegendItemStyle"
TargetType="{x:Type ChartingToolkit:LegendItem}">
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ChartingToolkit:LegendItem}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}" …Run Code Online (Sandbox Code Playgroud)