2015-09-23 153 views
1

我有一個Listview控件在XAML頁面中,它的ItemSource綁定到後面代碼中的集合。Windows Phone 8.1 Listview值映射

綁定到每個ListView項集合中的綁定數據模型都有一個整數字段,它可以包含值0或1。

我此字段綁定到一個TextBlock在ListView的ItemTemplate中,所以在ListView中,我看到包含文本0或1的行。

我的目標是在不更改ItemSource本身的情況下,在ListView中看到「sometext1」而不是0,「sometext2」而不是1。

我看到的問題是:

  1. TextBlock的控制似乎無法從代碼重寫,以創建一個自定義的TextBlock中,我可以編程修改的值。

  2. 如果我使用TextBox控件代替,我可以更改這些值,但是當顯示大量數據時程序會變慢,並且它也不會顯示更改後的值。 (在調試模式下,我可以看到,該文本屬性有新的價值,但文本框爲空,在屏幕上。)

+2

添加示例代碼,同時提及你已經嘗試過的所有東西。 –

+0

我試圖解釋的是我無法使用TextBox控件,因爲它太慢了。所以我想在運行時以編程方式更改TextBlock控件的Text值,其中TextBlock具有來自其itemsource的其他綁定值。我沒有示例代碼,因爲我不能這樣做。我試圖編寫自定義的TextBlock控件來做到這一點,但我無法做到這一點。在我看來,我不能從TextBlock類繼承自己的控件。 –

+0

哪個字段是你綁定到textBlock的(「我把這個字段綁定到xaml網格中的TextBlock控件,所以在listview中,我看到了0和1行。我的目標是看到」sometext1「而不是0,」sometext2「而不是1在ListView中不更改ItemSource。「) –

回答

0

這是針對Windows平臺的開發確實是最簡單的,如果你做的事情,在「 Windows「的方式。這涉及到利用XAML演示框架中內置的真棒功能,如綁定和轉換器!

我將忽略數據來自數據庫,因爲它可能會通過網絡或以編程方式創建並且應該沒有關係,底線是它存儲在內存中的某處。

假設你有一個模型類爲您的數據:

class Data 
{ 
    public int intField { get; set; } 
    public string otherField { get; set; } 
} 

,並在列表視圖,數據對象的集合你的頁面背後的代碼:

private ObservableCollection<Data> ListViewData = new ObservableCollection<Data>(); 

我們就可以綁定您的ListView數據到XAML頁面中的此集合,因爲我假設您已完成:

<ListView ItemsSource="{Binding ListViewData}"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical"> 
       <TextBlock x:Name="tbIntField" Text="{Binding intField, Mode=OneWay}"/> 
       <TextBlock x:Name="tbOtherField" Text="{Binding otherField, Mode=OneWay}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

正如你所觀察到的,在這一點上,intField TextBlock的內容將是intField的數值,這不是你想要的。因此,我們將使用轉換器基於intField的值來格式化TextBlock內容。

class intFieldConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var intField = (int)value; 
     switch (intField) 
     { 
      case 0: 
       return "Foo"; 
      case 1: 
       return "Bar"; 
      default: 
       return default(string); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

這一切確實是需要輸入int值,並返回要顯示基於字符串:

首先,在項目中創建一個新的類,我這實現了IValueConverter接口稱之爲intFieldConverter值。我沒有實現將其轉換回來的方法,但這只是相同的,但倒退了;如果你需要雙向綁定,你可以做到這一點。

我們現在需要告訴你的XAML這個轉換器。您的轉換命名空間添加到您的XAML頁面,如果你需要它:

​​

然後,我們需要在轉換器中的網頁標籤內的命名空間指定轉換資源:

<Page.Resources> 
    <converters:intFieldConverter x:Key="customIntToStringConverter"/> 
</Page.Resources> 

現在,我們可以用它我們TextBlock結合轉換的值並顯示在視圖中正確的字符串:

<TextBox x:Name="tbIntField" Text="{Binding intField, Mode=OneWay, Converter={StaticResource customIntToStringConverter}}"/> 

如果你的代碼隱藏有填充了一些觀察集合數據,現在您應該看到,listview中的每一行現在都將基於數據中的intField的值顯示「Foo」或「Bar」。

希望這有助於

注:

因爲我沒有一臺機器,此刻跟我來測試它在我沒有任何運行這段代碼來測試它的。我可以檢查我什麼時候回家,仔細檢查一下,如果您之前無法使用它,

+0

非常好。正是我想要的。非常感謝您的快速幫助! –

+0

我還有一個與此相關的問題:所以好吧,我通過編譯時已知的值改變了TextBlock的值,或者通過一個常量sql表達式來獲取值。但是我有xaml中的描述符對象,它將例如一個sql表達式綁定到TextBlocks,而這個sql的結果會給我改變的值。所以在轉換函數中,我會知道哪個TextBlock的值正在改變,以決定哪個sql表達式必須運行。 –

+0

好的,我可能找到了答案:我需要ConverterParameter來使用。謝謝。 –