如何解决在WPF XAML中使用MVVM代替MultiValueConverter
我已经使用XAML已有一段时间了,但是当我开始使用MVVM时,我并不了解它,所以我避免了它。因此,我项目中的所有逻辑都是用.xaml.cs而不是ViewModel.cs编写的。现在该项目很大,我必须根据请求将其某些部分移至MVVM,而且我不知道如何执行或实际从何处开始。
关于问题:
我有两个实体。我们称它们为A和Secret。 一个可以有秘密。如果A确实有它,我需要在A数据旁边显示Secret.Name和Secret.Description。 它们与以下内容绑定在一起:A.Secret == Secret.Id。
A数据和B数据可以独立更改,并且可以通过API调用进行接收/更改,但是A.Secret和Secret.Id绑定永远不会更改。
秘密只是SecretModel元素的数组
<ListBox ItemsSource="{Binding A,ElementName=uc}" SelectedItem="{Binding SelectedA,ElementName=uc}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" MaxHeight="300"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="ID:" TextAlignment="Right" />
<TextBlock Grid.Column="1" Text="{Binding Id}"/>
<TextBlock Grid.Row="1" Text="Type:" TextAlignment="Right"/>
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Type}" />
<TextBlock Grid.Row="2" Text="Secret:" TextAlignment="Right" Visibility="{Binding Secret,Converter={StaticResource StringToVisibilityConverter}}"/>
<TextBlock Grid.Row="2" Grid.Column="1" Visibility="{Binding Secret,Converter={StaticResource StringToVisibilityConverter}}">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource SecretIdToNameConverter}">
<Binding Path="Secret"/>
<Binding Path="Secrets" ElementName="uc"/>
</MultiBinding>
</TextBlock.Text>
<TextBlock.ToolTip>
<MultiBinding Converter="{StaticResource SecretIdToDescriptionConverter}">
<Binding Path="Secret"/>
<Binding Path="Secrets" ElementName="uc" />
</MultiBinding>
</TextBlock.ToolTip>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
转换器看起来像这样。
public class SecretIdToDescriptionConverter : IMultiValueConverter
{
public object Convert(object[] values,Type targetType,object parameter,CultureInfo culture)
{
if (values[0] != null && values[0] != DependencyProperty.UnsetValue && values[0] is string SecretId && values[1] != null && values[1] != DependencyProperty.UnsetValue && values[1] is SecretModel[] Secrets)
{
var tmp = Secrets.FirstOrDefault(secret => secret?.Id == SecretId);
if (tmp != null)
return tmp.Description;
return null;
}
else
{
return null;
}
}
public object[] ConvertBack(object value,Type[] targetTypes,CultureInfo culture)
{
throw new NotImplementedException();
}
}
如果有人可以给我一些帮助/指标,说明如何/应该如何从这种类型的Converter迁移到MVVM或为我提供一些向我解释的资源-对此将不胜感激。
最让我感到困惑的是: 我现在应该如何共享/访问.xaml.cs或.xaml和ViewModel.cs之间的数据? 如何调用以检索/提供此类数据? 是否可以创建将返回对应的SecretModel的方法,所以我可以在.xaml中调用后使用它? 喜欢
<magic ItemsSource= getSecret(A.Secret) >
<TextBlock Text = {Binding Name}/>
</magic>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。