Включать ли просмотр конкретной информации в модель - PullRequest
0 голосов
/ 28 ноября 2010

В настоящее время у меня есть класс, содержащий следующие свойства

public class Chromosome
{
    public int Length
    {
        get;
        set;
    }

    public int Number
    {
        get;
        set;
    }

    public Chromosome(int _length, int _number)
    {
        Length = _length;
        Number = _number;
    }
}

У меня есть данные списка, связанные с моей моделью представления. Источником элементов являются данные, связанные с наблюдаемыми объектами хромосом ChromosomeList .

<Grid>
        <ListBox Style="{StaticResource ListBoxStyle}"  
                 ItemsSource="{Binding Path=ChromosomeList}"
                 ItemTemplate="{StaticResource ChromosomeDataTemplate}">
        </ListBox>
    </Grid>

ItemTemplate для элементов списка: ChromosomeDataTemplate и показан ниже.

<DataTemplate x:Key="ChromosomeDataTemplate">
    <Border>
        <Grid Height="10">
            <TextBlock VerticalAlignment="Bottom" 
                       Text="{Binding Number}">
            </TextBlock>
        </Grid>
    </Border>

В этом случае я хочу, чтобы свойство Высота сетки было привязано к данным со свойством Длина хромосомы. Однако, поскольку Length очень велик, мне нужно, чтобы он составлял небольшой процент от фактического значения. Я мог бы сделать это:

  • Создание нового свойства, специфичного для измененной высоты

Однако я чувствую, что это не соответствует шаблону MVVM. Есть ли способ изменить значение Length при привязке данных?

Ответы [ 3 ]

3 голосов
/ 28 ноября 2010

Chromosome ваша модель.Ваш код XAML находится в вашем представлении.Гипотетическое значение «модифицированной длины» должно находиться в вашей ViewModel.

Вы правы, когда говорите, что создание нового свойства для измененной высоты - это не MVVM (и вообще, конечно, очень плохая идея).

Для лучшего подхода вы обычно помещаете свойство модифицированной длины во ViewModel.Однако теперь ваша проблема в том, что ваша ViewModel имеет ObservableCollection<Chromosome> и поэтому не может предоставить простое свойство измененной длины для каждого из Chromosome экземпляров.

Поэтому у вас есть два варианта:

  1. Реализация ValueConverter, которая переводит оригинал Length в ученика Grid.Height.Это может быть либо в вашей ViewModel, либо в View, но я думаю, что помещать его в ViewModel нецелесообразно (так как он будет использоваться только определенным View).Это самый простой подход.

  2. Обернуть каждый Chromosome в его собственную модель представления, например, ChromosomeViewModel.Ваша существующая ViewModel будет принимать коллекцию Chromosome с и выставлять ObservableCollection<ChromosomeViewModel>.Затем вы создадите ChromosomeView, привязанный к каждой ViewModel, что в основном будет тем, что есть у вас в ChromosomeDataTemplate.Поскольку ChromosomeView будет привязан к ChromosomeViewModel, который, в свою очередь, включает в себя один Chromosome, теперь вы можете предоставить свойство «модифицированной длины» непосредственно в ChromosomeViewModel.

Если это только для этого, я предлагаю перейти с ValueConverter.Однако помните о втором подходе для более сложных сценариев.

0 голосов
/ 28 ноября 2010

Почему бы не использовать конвертер здесь?См. Например MSDN

0 голосов
/ 28 ноября 2010

Вам необходимо использовать ValueConverter: http://blogs.msdn.com/b/bencon/archive/2006/05/10/594886.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...