2013-12-21 4 views
0

Я использую следующий код для отображения ListView. ListView содержит TextBlock, который имеет FontSized связанный с переменной на мой MainPage:Метро XAML Связывание внутри ListView

   <ListView x:Name="ListView" 
       SelectionMode="Single" 
       SelectionChanged="ListView_OnSelectionChanged" 
       Grid.Row="1" 
       Margin="8,16"   
       > 
       <ListView.ItemTemplate> 
         <DataTemplate> 
          <StackPanel> 
           <TextBlock Text="{Binding DisplayName}" 
        FontSize="{Binding Path=FontSizeListViewTitle}" Margin="6,0,0,0" TextWrapping="NoWrap" /> 
          </StackPanel> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 

Проблема заключается в том, что FontSize = «{Binding Path = FontSizeListViewTitle}» не отображается корректно работать. Он показывает мне текст с fontSize, близким к 6 (или что-то еще), несмотря на то, что переменная FontSizeListViewTitle принимает значения от 16 до 24.

Интересно то, что если я поместил TextBlock за пределы ListView, работает отлично. Проблема возникает только при попытке использовать привязку внутри ListView. Кроме того, Text = "{Binding DisplayName} отлично работает и TextBlock показывает текст, который он должен показать

Часть кода из файла .cs Теперь:.

private int _fontSizeListViewTitle; 
    public int FontSizeListViewTitle 
    { 
     get { return _fontSizeListViewTitle; } 
     set 
     { 
      _fontSizeListViewTitle = value; 

      OnPropertyChanged("FontSizeListViewTitle"); 
     } 
    } 

    #region INotifyPropertyChanged implementation 
    public event PropertyChangedEventHandler PropertyChanged; 

    internal void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

    public MainPage() 
    { 

     InitializeComponent(); 

     this.DataContext = this; 

     ListView.ItemsSource = MyList; // MyList is an Observable Collection 
    } 

ответ

0

DataTemplate ищет привязка размера шрифта в источнике элементов списка, а не общий файл данных. Вы можете использовать относительный источник в привязке размера шрифта, как показано ниже:

FontSize = "{Binding Path = DataContext.FontSizeListViewTile, RelativeSource = {RelativeSource TemplatedParent }} "

Я сейчас не нахожусь перед моим компьютером, поэтому синтаксис может слегка отклониться, но вы поняли эту идею. MS документ:

http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.data.binding.relativesource.aspx

Док не упоминает функцию предок, так что я не уверен, если это доступно в библиотеках WinRT.

+0

Он не возвращает никаких ошибок, но когда я запускаю программу, и я пытаюсь добавить элемент в ListView, приложение аварийно завершает работу. – TheQuestioner

+0

Что делать, если я пытаюсь сделать что-то вроде и изменить FontSize из кода? Проблема в том, что я не знаю, как получить доступ к TitleTextBlock. ListView.TitleTextBlock не работает. – TheQuestioner

3

DataContext ListViewItem - это объект в вашей коллекции Observable. Вы можете увидеть это, когда объявляете TextBlock Text binding в ItemTemplate ListView как {Binding DisplayName} вместо {Binding MyList.DisplayName} или {Binding MyList[0].DisplayName} или что-нибудь еще. И FontSize="{Binding FontSizeListViewTitle}" не будет работать, потому что объект в Observable не имеет свойства FontSizeListViewTitle.

Решение связать FontSize к DataContext ListView, где вы положили FontSizeListViewTitle свойство, как следующее:

<ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding DisplayName}" Margin="6,0,0,0" TextWrapping="NoWrap" 
          FontSize="{Binding Path=DataContext.FontSizeListViewTile, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

UPDATE:

Поскольку FindAncestor отсутствует в WinRT, самая простая работа вокруг to use ElementName в найдите ListView, а затем привяжите FontSize к DataContext ListView.

<ListView x:Name="listView"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding DisplayName}" Margin="6,0,0,0" TextWrapping="NoWrap" 
          FontSize="{Binding ElementName=listView, Path=DataContext.FontSizeListViewTile}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

Тип AncestorType и x: по-видимому, не распознаются. – TheQuestioner

+0

да, я не заметил вопроса, что WinRT мой код работал в WPF. Я обновлю работу для WinRT. – har07

+0

Да, все еще не работает. Он не распознает FontSizeListViewTile, потому что «DataContext имеет тип« объект ». – TheQuestioner

Смежные вопросы