亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

wpf將不同的數據模板綁定到contentcontrol中不同類型的對象

wpf將不同的數據模板綁定到contentcontrol中不同類型的對象

C#
守候你守候我 2022-01-15 17:21:57
我是 WPF 和 MVVM 的新手。我要做的是將兩個不同的 DataTemplates 綁定到一個 ContentControl 中的兩種不同類型的對象。每種對象對應一個DataTemplate。這兩種對象分別稱為單元和組件。它們包含不同的屬性。例如,一個 Unit 有 3 個屬性:Id、Name和Manufacture。一個組件有 3 個屬性Id、Type和Materials。示例代碼如下:public class Unit : INotifyPropertyChanged{    private int _id;    private string _name;    private string _manufacture;    public int Id    {        get {return this._id}        set        {            this._id = value;            OnPropertyChanged("Id")        }    {    public string Name    {        get {return this._name}        set        {            this._id = value;            OnPropertyChanged("Name")        }    {    public string Manufacture    {        get {return this._manufacture}        set        {            this._id = value;            OnPropertyChanged("Manufacture")        }    {    public event PropertyChangedEventHandler PropertyChanged;    ...}Component 類具有類似的結構。在 MainWindow 中,左側有一個 ListBox 列出對象的名稱(我以后會將其更改為 TreeView),右側有一個 ContentControl。我希望當我選擇一個對象的名稱時,該對象的詳細信息將顯示在右側。MainWindow的代碼如下:<Windows.Resources>    <CollectionViewSource        Source="{Binding Source={x:Static Application.Current}, Path=UnitItems}"        x:Key="UnitDataView">    </CollectionViewSource>    <CollectionViewSource        Source="{Binding Source={x:Static Application.Current}, Path=ComponentItems}"        x:Key="ComponentDataView">    </CollectionViewSource>    <CompositeCollection x:Key="AllDataView        <CollectionContainer Collection="{Binding Source={StaticResource UnitDataView}}" />        <CollectionContainer Collection="{Binding Source={StaticResource ComponentDataView}}" />    </CompositeCollection><local: PartDataTemplateSelector x:Key="MyDataTemplateSelector"                                 UnitTemplate="{StaticResource unitTemplate}"                                 ComponentTemplate="{StaticResource componentTemplate}" /></Windows.Resources>
查看完整描述

1 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

您不需要 DataTemplateSelector。只需確??梢宰詣舆x擇詳細的 DataTemplates,而不是為其分配密鑰。


您的對象似乎也不需要兩個集合。您不妨從一個公共基類派生 Unit 和 Component,并擁有一個基類引用集合。


最后應該有一個視圖模型,除了對象集合之外,它還具有當前選定對象的屬性。


以這個簡化的示例視圖模型為例:


public class Base

{

    public int Id { get; set; }

}


public class Unit : Base

{

    public string UnitData { get; set; }

}


public class Component : Base

{

    public string ComponentData { get; set; }

}


public class ViewModel : INotifyPropertyChanged

{

    public event PropertyChangedEventHandler PropertyChanged;


    public ObservableCollection<Base> Objects { get; }

        = new ObservableCollection<Base>();


    private Base selectedObject;


    public Base SelectedObject

    {

        get { return selectedObject; }

        set

        {

            selectedObject = value;

            PropertyChanged?.Invoke(this,

               new PropertyChangedEventArgs(nameof(SelectedObject)));

        }

    }

}

它的一個實例應該分配給窗口的 DataContext:


public MainWindow()

{

    InitializeComponent();


    var vm = new ViewModel();

    vm.Objects.Add(new Unit { Id = 1, UnitData = "Unit Data" });

    vm.Objects.Add(new Component { Id = 2, ComponentData = "Component Data" });


    DataContext = vm;

}

最后,XAML 將是這樣的:


<ListBox ItemsSource="{Binding Objects}"

            SelectedItem="{Binding SelectedObject}">

    <ListBox.Resources>

        <DataTemplate DataType="{x:Type local:Unit}">

            <TextBlock>

                <Run Text="Unit, Id:"/>

                <Run  Text="{Binding Id}"/>

            </TextBlock>

        </DataTemplate>

        <DataTemplate DataType="{x:Type local:Component}">

            <TextBlock>

                <Run Text="Component, Id:"/>

                <Run  Text="{Binding Id}"/>

            </TextBlock>

        </DataTemplate>

    </ListBox.Resources>

</ListBox>

<ContentControl Grid.Column="1" Content="{Binding SelectedObject}">

    <ContentControl.Resources>

        <DataTemplate DataType="{x:Type local:Unit}">

            <StackPanel>

                <TextBlock Text="{Binding Id}"/>

                <TextBlock Text="{Binding UnitData}"/>

            </StackPanel>

        </DataTemplate>

        <DataTemplate DataType="{x:Type local:Component}">

            <StackPanel>

                <TextBlock Text="{Binding Id}"/>

                <TextBlock Text="{Binding ComponentData}"/>

            </StackPanel>

        </DataTemplate>

    </ContentControl.Resources>

</ContentControl>


查看完整回答
反對 回復 2022-01-15
  • 1 回答
  • 0 關注
  • 276 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號