2011-11-25 144 views
0

我需要爲技術應用程序顯示內存轉儲。每個字節(單元格)應該通過DataTemplate來定義,以顯示其他信息(通過設置背景顏色,單個工具提示等突出顯示)。我做了以下嘗試:變量綁定路徑

<DataTemplate x:Key="HexNumberTemplate"> 
    <Grid> 
     [...] 
     <TextBlock> 
     <TextBlock.Text> 
      <Binding Path="Cell[0].Value"> 
      <Binding.Converter> 
       [...] 
      </Binding.Converter> 
      </Binding> 
     </TextBlock.Text> 
     </TextBlock> 
    </Grid> 
    </DataTemplate> 

最後的結果應該是這樣的:
Dump example

我的問題是修復編碼綁定路徑。 「單元格」是包含顯示單元格的所有必要信息的對象列表。使用這種方法,我需要用Cell [0]到Cell [15]定義16次相同的DataTemplate。我絕對想避免這個!
我讀了一個定義源代碼中的DataTemplate的方法,我在該字符串中組裝XAML並調用Markup.XamlReader.Load(MemoryStreamOfTheString)。但是在這裏,我失去了Visual Studio IDE的舒適感。
是否可以在XAML中定義DataTemplate並使Cell-Object的索引器成爲參數?

回答

2

你應該像你讀過的那樣做:通過加載XamlReader來動態創建模板。爲了有XAML編輯器的舒適性,你可以在一個單獨的XAML文件中像這樣定義的模板:

<DataTemplate 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid DataContext="{Binding Current_Cell}"> 
     <!--Your template controls goes here.--> 
    </Grid> 
</DataTemplate> 

然後設置類型此文件資源,並將其加載到串並簡單地與每個單獨更換Current_Cell在構建視圖時從字符串加載模板之前,請使用單元格編號。 通過設置Grid的DataContext,您可以幫助您使用模板中的其他綁定(上下文已經設置爲當前單元格,並且不需要將其替換到任何地方)。

我是在同樣的情況最近,唯一的區別是,我有網完全動態列(從服務器加載),所以我甚至沒有機會創造16個模板:)

+0

+1(簡單)想法將其導出到另一個XAML以使IDE更加舒適。我沒有提到的是,我有你未知的數量的列。這裏通用內存佈局的圖片僅僅是爲了簡化SO的問題。 (如果問題太複雜,你不會得到任何答案。) – Markus

+0

我認爲這是我想要在我的情況下去的方式。據我在這裏閱讀(http://support.microsoft.com/kb/319292),有必要將其設置爲嵌入式資源。 – Markus

1

嘗試使用ListBoxes。

外部ListBox也包含ListBox的行,每個行綁定到一個List對象。你可以創建ListBoxItems的DataTemplate。

<DataTemplate x:Key="innerListBoxItem"> 
    [...] 
    <TextBlock Text="{Binding Value}" /> 
    [...] 
<DataTemplate> 

<DataTemplate x:key="outerListBoxItem"> 
    <Grid> 
     <ListBox ItemTemplate="{StaticResource innerListBoxItem}" ItemCollection="{Binding Cells}"/> 
    </Grid> 
<DataTemplate> 

和徘徊無論你想把這個控制:背後

<ListBox ItemTemplate="{StaticResource outerListBoxItem}" ItemCollection={Binding CellsList}"/> 

代碼:

public class ListOfCells { public List<Cell> Cells {get; set; } } 

public List<ListOfCells> CellsList {get; private set; } 
+0

和唐忘了將outerListBoxItems列表ItemsPanel設置爲水平對齊的模板StackPanel –

+0

啊!當然是。一個內部ListBox可以迭代單元格列表。感謝您的新想法。 – Markus

0

我會建議使用帶有自定義頭部和單元模板一列的DataGrid。 您的網格不會從單個單元格調整大小中獲益,是嗎?你的頭文件將有固定數量的列,你的單元格模板可以實現爲ListControl的一個子類 - 我們只需要將StackPanel的方向從垂直改爲水平。然後,你的綁定對象將是一個字節的集合,這很容易,因爲你的單元格控件是從ListControl派生的。

請讓我們知道這是否合理。

1

您可以嘗試使用Attached Behavior模式。您可以將附加屬性綁定到列號,並且附加的行爲會將文本綁定到給定列號的所需單元格。

+0

+1爲非常有趣的鏈接。我想多花點時間思考一下。 – Markus