2

現在、以下のようなビューモデルがあります。TCmタイプは、ドメインモデルタイプ、つまり電話番号です。そして、サブクラス化された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); }
    }
}

サブクラス化されたVM

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のどこかにアイテムをキャストする必要があると誤って想定していました。

ただし、バインディングエンジンは、名前でプロパティを検出するためにリフレクションを使用している必要がありますが、キャストは不要です。

4

1 に答える 1

3

質問を正しく理解したかどうかはわかりませんが、タイプごとに特定の DataTemplates が考えられると思います。

意見 :

<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>

ビューモデル:

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>();
        }
    }
}

Setupcode (コード ビハインド、ええ...)

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;
        }
    }
}

さまざまな VM のビューを提供でき、これに基づいてさまざまなものをレンダリングします。私の例では、両方の VM タイプに対応する DataGrid がありますが、もっと異なっていた可能性があります。

于 2012-10-05T13:42:19.407 に答える