使用 MVVM 模式从视图模型到 WPF 中的视图的条件绑定

Conditional binding from view model to view in WPF using MVVM pattern

我正在使用 MVVM 模式开发 WPF 应用程序。我在视图中有一个组合,在视图模型(项目和组织)中有两个列表。根据组织列表项,我必须绑定或不绑定组织的名称。 例如,如果组织列表的计数 属性 是 1,则组合框项目必须是 "ProjectName",如果组织的计数 属性列表大于 1,组合框项目应类似于 "ProjectName - OrganizationName"。 这是我的 XAML 代码:

<ComboBox x:Name="textBox3" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" ItemsSource="{Binding Path=Projects}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding Path=SelectedProject}">
        </ComboBox>

我应该如何实现这个目的。我希望能得到一点帮助。干杯。

我在视图模型中添加了 属性 projectFullName,但我得到一个空的组合框:

 public string ProjectFullName
    {
        get
        {
            if (this.organizations.ToList().Count > 1)
            {
                this.projectFullName = string.Format("{}{0} - {1}", this.selectedProject.Name, this.organizations.First(org => org.Id == this.selectedProject.OrganizationId).Name);
            }
            else if (this.organizations.ToList().Count == 1)
            {
                this.projectFullName = this.selectedProject.Name;
            }
            return this.projectFullName;
        }
    }

XAML代码:

<ComboBox x:Name="textBox3" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" ItemsSource="{Binding Path=Projects}" DisplayMemberPath="{Binding Path=ProjectFullName}" IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding Path=SelectedProject}">

        </ComboBox>

你有多种选择来实现它,但我认为最好的是:

将 属性 添加到您的数据上下文,将被称为 "FullName" 或其他名称。 那将 return:(伪) 如果项目计数 > 0 那么 return 名称 + '-' + 项目名称 否则 return 姓名

然后将 DisplayMemberPath 绑定到 FullName。

Datatrigger 确实是您的朋友。确保 ComboBox 未设置 DisplayMemberPath,因为这将覆盖样式设置器。

<Style x:Key="MyStyle"  TargetType="ComboBox">
        <Setter Property="DisplayMemberPath" Value="DefaultName"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Items.Count}" Value="1">
                <Setter Property="DisplayMemberPath" Value="OtherName"/>
            </DataTrigger>
        </Style.Triggers>
 </Style>