c# - 是否在模型中包含 View 特定信息

标签 c# wpf mvvm c#-4.0

我目前有一个包含以下属性的类

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

    public int Number
    {
        get;
        set;
    }

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

我有一个列表框数据绑定(bind)到我的 View 模型。项目源是绑定(bind)到 的数据。可观察 染色体对象 染色体列表 .
<Grid>
        <ListBox Style="{StaticResource ListBoxStyle}"  
                 ItemsSource="{Binding Path=ChromosomeList}"
                 ItemTemplate="{StaticResource ChromosomeDataTemplate}">
        </ListBox>
    </Grid>

列表框项目的 ItemTemplate 是 染色体数据模板 如下图所示。
<DataTemplate x:Key="ChromosomeDataTemplate">
    <Border>
        <Grid Height="10">
            <TextBlock VerticalAlignment="Bottom" 
                       Text="{Binding Number}">
            </TextBlock>
        </Grid>
    </Border>

在这种情况下,我想要 高度 将数据绑定(bind)到 的网格的属性长度 染色体的性质。然而,作为 长度 非常大,我需要它是实际值的一小部分。我可以通过以下方式做到这一点:
  • 为修改后的高度创建一个新属性

  • 但是,我觉得这不遵循 MVVM 模式。有没有办法修改长度 数据绑定(bind)时的值呢?

    最佳答案

    Chromosome是你的模特。您的 XAML 代码位于您的 View 中。假设的“修改长度”值应该驻留在您的 ViewModel 中。

    您说为修改后的高度创建新属性不是 MVVM 是正确的(当然,这通常是一个非常糟糕的主意)。

    为了获得更好的方法,您通常会将 modified-length 属性放在 ViewModel 中。但是你的问题是你的 ViewModel 有一个 ObservableCollection<Chromosome>因此无法为 Chromosome 中的每一个提供简单的修改长度属性实例。

    因此,您有两个选择:

  • 实现 ValueConverter 翻译原文Length给一个合适的Grid.Height .这可能在您的 ViewModel 或 View 中,但我认为将其放在 ViewModel 中是不合适的(因为它将仅由特定 View 使用)。这是最简单的方法。
  • 包裹每个 Chromosome在它自己的 ViewModel 中,例如ChromosomeViewModel .您现有的 ViewModel 将采用 Chromosome 的集合s 并公开 ObservableCollection<ChromosomeViewModel> .然后您将创建一个 ChromosomeView绑定(bind)到每个 ViewModel,这基本上就是您现在在 ChromosomeDataTemplate 中的内容.由于ChromosomeView将绑定(bind)到 ChromosomeViewModel ,它又包装了一个 Chromosome ,您现在可以直接在 ChromosomeViewModel 中提供“修改长度”属性.

  • 如果只是为了这个,我建议使用 ValueConverter .但是,对于更复杂的场景,请记住第二种方法。

    关于c# - 是否在模型中包含 View 特定信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4297581/

    相关文章:

    c# - 未处理的异常 : System. Runtime.InteropServices.COMException (0x800A03EC)

    c# - string.Join 奇怪的行为

    c# - WPF 中的自定义鼠标光标大小

    c# - WPF 将第三方 ResourceDictionary 添加到 App.xaml?

    silverlight - 使用数据绑定(bind)实现 MVVM 模式时,Silverlight 应用程序的性能是否会受到影响?

    c# - 一个 aspx 页面具有 utf-8 编码

    c# - 自定义调用 Action 的 ASP Web API Json 序列化

    c# - WPF MVVM依赖属性获取负值

    c# - 无法正确实现WPF MVVM

    c# - WPF MVVM DataBindings 停止更新