C# MVVM绑定:在视图对象中创建新对象
通常我会在视图中创建所有对象,并将其属性绑定到viewmodel/model。但是如果控件具有另一种类型的属性,而不是string/bool,该怎么办 例如,一个简单的图表可以有“chart.legend”类型的图例 观点:C# MVVM绑定:在视图对象中创建新对象,c#,wpf,mvvm,C#,Wpf,Mvvm,通常我会在视图中创建所有对象,并将其属性绑定到viewmodel/model。但是如果控件具有另一种类型的属性,而不是string/bool,该怎么办 例如,一个简单的图表可以有“chart.legend”类型的图例 观点: <ChartControl x:Name="{Binding ChartModelObject.Name}" Data="{Binding ChartModelObject.Data}"> <ChartControl.Legend Postiton
<ChartControl x:Name="{Binding ChartModelObject.Name}" Data="{Binding ChartModelObject.Data}">
<ChartControl.Legend Postiton="{Binding ChartModelObject.Legend.Position}">
<ChartControlLegend/>
</ChartControl.Legend">
</ChartControl>
模型呢
public class ChartModel
{
public LegendModel Legend { get; set; }
public String Name { get; set; }
public IData Data { get; set; }
}
public class LegendModel
{
public PositionEnum Position { get; set; }
}
根据我的ChartModels属性“Legend”是否有LegendModel类型的实例且不为null,我希望显示图例,否则不显示。现在我必须在视图中创建一个类型为“ChartControl.Legend”的对象,或者用另一种方式将ChartControl.Legend直接绑定到ChartModel.LegendModel。但我如何做到这一点
编辑:
一个更一般的例子
视图
<Button Content="{Binding Name}" FontSize="14" FontWeight="Bold">
<!-- Only use a LinearGradientBrush if there is a ExampleModelObject Object-->
<Button.Background>
<LinearGradientBrush StartPoint="0,0.5"
EndPoint="1,0.5">
<GradientStop Color="Green" Offset="{Binding ExampleModelObject.FirstPoint}" />
<GradientStop Color="White" Offset="{Binding ExampleModelObject.SecondPoint}" />
</LinearGradientBrush>
</Button.Background>
</Button>
模型
public class ExampleViewModel
{
public ButtonBackgroundExampleModel ExampleModelObject{ get; set; }
public string Name {get;set}
}
public class ButtonBackgroundExampleModel
{
public double FirstPoint { get; set; }
public double SecondPoint { get; set; }
}
根据ViewModel是否有ButtonBackgroundExampleModel的实例,我想创建一个Button.Background.LinearGradientBrush。如果没有ButtonBackgroundExampleModel(没有第一个点,第二个点),那么就不应该有Button.Background。因此,它应该是:
<Button Content="{Binding Name}" FontSize="14" FontWeight="Bold">
</Button>
您可以使用带有
数据触发器的样式
来确定是否设置了ExampleModelObject
属性:
<Button Content="{Binding Name}" FontSize="14" FontWeight="Bold">
<!-- Only use a LinearGradientBrush if there is a ExampleModelObject Object-->
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Color="Green" Offset="{Binding ExampleModelObject.FirstPoint}" />
<GradientStop Color="White" Offset="{Binding ExampleModelObject.SecondPoint}" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding ExampleModelObject}" Value="{x:Null}">
<Setter Property="Background" Value="#FFDDDDDD" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
“如果我的ChartModels属性“Legend”具有LegendModel类型的实例且不为空,我希望显示该图例,否则不显示”-听起来像是DataTrigger@Alexander:您应该在视图模型中创建ChartModel
。如果没有图例,视图中的(默认)模板应注意不显示该图例。@mm8但是如何注意不创建或显示ChartControl.legend(在视图中)呢?我是否必须在代码隐藏中创建它,或者如何在xaml中处理它?@Alexander:请澄清您正在使用的ChartControl
,您想做什么,以及您通过发布一个命令尝试了什么。@mm8添加了一个更一般的示例
<Button Content="{Binding Name}" FontSize="14" FontWeight="Bold">
<!-- Only use a LinearGradientBrush if there is a ExampleModelObject Object-->
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
<GradientStop Color="Green" Offset="{Binding ExampleModelObject.FirstPoint}" />
<GradientStop Color="White" Offset="{Binding ExampleModelObject.SecondPoint}" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding ExampleModelObject}" Value="{x:Null}">
<Setter Property="Background" Value="#FFDDDDDD" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>