我想將SelectedItema系結TabControl到我的視圖模型中的相應欄位,但是同時仍然在其TabControl自身中宣告可用專案(而不是 using ItemsSource)并檢索它們Content作為實際的SelectedItem. 含義:如果選擇了一個選項卡,它Content應該以SelectedItem(而不是TabItem)結束,反之亦然。
示例視圖模型,繼承了沒有 (!) 集合的Caliburn.Micro 導體:
public class MyViewModelConductor : Conductor<ConductedViewModelBase> {
public ViewModelA { get; set; }
public ViewModelB { get; set; }
}
TabControl和XAML中的對應:
<TabControl SelectedItem="{Binding ActiveItem}">
<TabItem cal:View.Model="{Binding ViewModelA}">
<TabItem.Header> <!-- vm specific fancy UI stuff --> </TabItem.Header>
</TabItem>
<TabItem cal:View.Model="{Binding ViewModelB}">
<TabItem.Header> <!-- vm specific fancy UI stuff --> </TabItem.Header>
</TabItem>
</TabControl>
我知道我可以只使用 egConductor<'1>.Collection.OneActive和 bind to ItemsSource,但有幾個原因我不想這樣做:
- 指揮方可用的視圖模型是一個固定集合,由公開的屬性宣告,而不是無限集合
- 對于 UI 方面,對于每個
TabItem我需要宣告一個特定的標頭,其中包含許多特定于平臺的 UI 相關的東西(圖示、顏色),因此我不想將它泄漏到我的視圖模型中。
我已經嘗試使用SelectedValue和SelectedValuePath系結到 TabControl 本身(例如SelectedValue="{Binding RelativeSource={RelativeSource Self}, Path=SelectedItem}" SelectedValuePath="Content"),但是 WPF 嘗試Content在我的系結視圖模型上查找一個屬性,只要一個被選中。
uj5u.com熱心網友回復:
您必須將 系結SelectedValue到您的視圖模型類。然后使用SelectedValuePath來宣告 的哪個屬性SelectedItem用作SelectedValue。
<TabControl SelectedValuePath="Content"
SelectedValue="{Binding ViewModelSelectedContentProperty}">
<TabItem cal:View.Model="{Binding ViewModelA}">
<TabItem.Header> <!-- vm specific fancy UI stuff --> </TabItem.Header>
</TabItem>
<TabItem cal:View.Model="{Binding ViewModelB}">
<TabItem.Header> <!-- vm specific fancy UI stuff --> </TabItem.Header>
</TabItem>
</TabControl>
但我不推薦這個。您應該將 系結ItemSource到一組資料模型并定義 DataTemplates 為您提供干凈的設計和動態/可擴展的行為。通常您會使用DataTemplate來TabControl.ContentTemplate模板化內容和TabControl.ItemTemplate模板化TabItem(TabControl標題)。
不要對ItemsControl專案進行硬編碼。他們絕對沒有理由避免資料模板化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520484.html
