使用 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>
我正在使用 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>