gpt4 book ai didi

c# - 通用项目的 wpf 类型转换

转载 作者:行者123 更新时间:2023-11-30 22:24:34 24 4
gpt4 key购买 nike

我有一个 View 模型,目前如下所示。 TCm 类型是领域模型类型,即TelephoneNumber。还有子类 PcmDetailVms(即 TelephoneNumberPcmDetailVm)。我想将这些属性用于处理特定 TCm(即 TelephoneNumber)的 DataGrid。

虽然将它子类化并进行转换一点也不可怕,但我想知道是否有任何内置的 xaml 功能可以进行转换。或者使用转换器是否更符合习惯?

干杯,
贝瑞尔

查看模型

public class PcmShellVm<TCm> : ... where TCm : ContactMechanism
{
public ObservableCollection<PcmDetailVm> DetailVms { get; protected set; }

public PcmDetailVm SelectedVm {
get { return _collectionView.CurrentItem as PcmDetailVm; }
set { _collectionView.MoveCurrentTo(value); }
}
}

子类虚拟机

public class TelecomNumberPcmShellVm : PcmShellVm<TelecomNumber>
{
...

public IEnumerable<TelecomPcmDetailVm> CastedDetailVms { get { return DetailVms.Cast<TelecomPcmDetailVm>(); } }

public TelecomPcmDetailVm CastedSelectedVm
{
get { return (TelecomPcmDetailVm) SelectedVm; }
set { SelectedVm = value; }
}
}

编辑

所以安德烈对我上面没有问得很清楚的问题有正确的答案。我错误地认为我需要在 xaml 中的某个地方转换我的项目,就像我需要在代码中做的那样。

但是,绑定(bind)引擎必须使用反射来按名称发现属性,这样就不需要强制转换了。

最佳答案

我不确定我是否正确理解了这个问题,但我认为每种类型的特定 DataTemplates 是一个想法。

View :

<Window x:Class="WpfApplication18.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfApplication18="clr-namespace:WpfApplication18"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.Resources>
<DataTemplate DataType="{x:Type WpfApplication18:PersonsVM}">
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding FirstName}" Header="First name"/>
<DataGridTextColumn Binding="{Binding LastName}" Header="Last name"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
<DataTemplate DataType="{x:Type WpfApplication18:SpecificPersonsVM}">
<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding LastName}" Header="Last name"/>
<DataGridTextColumn Binding="{Binding FirstName}" Header="First name"/>
<DataGridTextColumn Binding="{Binding Age}" Header="Age"/>
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</Grid.Resources>

<ContentControl Content="{Binding}"/>
</Grid>
</Window>

View 模型:

using System.Collections.ObjectModel;

namespace WpfApplication18
{
public class PersonVM
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

public class SpecificPersonVM : PersonVM
{
public byte Age { get; set; }
}

public class PersonsVM
{
public ObservableCollection<PersonVM> Items { get; private set; }

public PersonsVM()
{
Items = new ObservableCollection<PersonVM>();
}
}

public class SpecificPersonsVM
{
public ObservableCollection<SpecificPersonVM> Items { get; private set; }

public SpecificPersonsVM()
{
Items = new ObservableCollection<SpecificPersonVM>();
}
}
}

设置代码(代码隐藏,是的...)

namespace WpfApplication18
{
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();

//SetupPersonsVM();
SetupSpecificPersonsVM();
}

private void SetupSpecificPersonsVM()
{
var vm = new SpecificPersonsVM();
vm.Items.Add(new SpecificPersonVM { FirstName = "Johny", LastName = "Bravo", Age = 17 });
vm.Items.Add(new SpecificPersonVM { FirstName = "Dude", LastName = "Gray", Age = 22 });
vm.Items.Add(new SpecificPersonVM { FirstName = "Scott", LastName = "Thomas", Age = 34 });
DataContext = vm;
}

private void SetupPersonsVM()
{
var vm = new PersonsVM();
vm.Items.Add(new PersonVM { FirstName = "John", LastName = "Scott" });
vm.Items.Add(new PersonVM { FirstName = "Matthew", LastName = "Johnson" });
DataContext = vm;
}
}
}

您可以为 View 提供不同的 VM,它会基于此呈现不同的内容。在我的示例中,两种 VM 类型都有一个 DataGrid,但它可能会有更多不同。

关于c# - 通用项目的 wpf 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12747332/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com