Привязка MVVM: создать новый объект в объекте представления - PullRequest
0 голосов
/ 23 марта 2020

Обычно я создаю все объекты в представлении и связываю его свойства с моделью / моделью представления. Но что, если у элемента управления есть свойство другого типа, а не 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>

с ViewModel

public class ChartViewModel
{
    public ChartModel ChartModelObject{ get; set; }
}

и моделью

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 и нет Я хотел бы показать легенду, иначе нет. Теперь мне нужно создать объект типа "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>

ViewModel

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.LinearGradientBru sh. Если нет ButtonBackgroundExampleModel (нет FirstPoint, SecondPoint), то не должно быть Button.Background. Итак, должно быть:

<Button Content="{Binding Name}" FontSize="14" FontWeight="Bold">
</Button>

1 Ответ

1 голос
/ 24 марта 2020

Вы можете использовать Style с DataTrigger, чтобы определить, установлено ли свойство 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...