C# MVVM绑定:在视图对象中创建新对象

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

通常我会在视图中创建所有对象,并将其属性绑定到viewmodel/model。但是如果控件具有另一种类型的属性,而不是string/bool,该怎么办

例如,一个简单的图表可以有“chart.legend”类型的图例

观点:

<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>