Я нашел, что сессии очень полезны, но несколько вещей отметить:
1), Что PHP может сохранить Ваши сессии в tmp папке или другом каталоге, который может быть доступен для других пользователей на Вашем сервере. Можно измениться, каталог были сессии, хранятся путем движения в файл php.ini.
2), Если Вы настраиваете высокую систему ценностей, которой нужны очень строгие меры безопасности, Вы могли бы хотеть зашифровать данные перед отправкой его в сессию, и дешифруют его для использования его.Примечание: это могло бы создать слишком много служебное в зависимости от Вашего трафика / мощность сервера.
3) я нашел это session_destroy (); doesn’t удаляют сессию сразу же, все еще необходимо ожидать сборщика "мусора" PHP для чистки сессий. Можно изменить частоту, что сборщик "мусора" запущен в файле php.ini. Но все еще doesn’t, кажутся очень надежными, больше информации http://www.captain.at/howto-php-sessions.php
После часа вытаскивания волос я пришел к убеждению, что вы не можете ссылаться на другой DataContext внутри DataTemplate для всплывающей подсказки . Для других привязок это вполне возможно, как показали другие плакаты. Вот почему вы также не можете использовать трюк RelativeSource. Что вы можете сделать, так это реализовать статическое свойство в своем классе Item и ссылку , которая :
<Window x:Class="ToolTipSpike.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300"
Name="Root"
xmlns:ToolTipSpike="clr-namespace:ToolTipSpike">
<Grid>
<ItemsControl x:Name="itemsControl" ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding ItemName}">
<TextBlock.ToolTip>
<ToolTip>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="{Binding ItemDescription}" />
<TextBlock Grid.Row="1"
Text="{Binding Source={x:Static ToolTipSpike:Item.GlobalText},
Path=.}"
/>
</Grid>
</ToolTip>
</TextBlock.ToolTip>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
</Window>
using System.Collections.Generic;
using System.Windows;
namespace ToolTipSpike
{
public partial class Window1 : Window
{
public List<Item> Items { get; private set; }
public Window1()
{
InitializeComponent();
var itemList = new List<Item>
{
new Item { ItemName = "First Item", ItemDescription = "This is the first item." },
new Item { ItemName = "Second Item", ItemDescription = "This is the second item." }
};
this.Items = itemList;
this.DataContext = this;
}
}
public class Item
{
static Item()
{
GlobalText = "Additional Text";
}
public static string GlobalText { get; set; }
public string ItemName{ get; set;}
public string ItemDescription{ get; set;}
}
}
Хорошо, привязка относительного источника не работает в этом случае . На самом деле он работает на основе шаблона данных, вы можете найти множество примеров этого в Интернете. Но здесь (вы были правы, Дэвид, в своем комментарии) ToolTip - это особый зверь, который неправильно размещен в VisualTree (это свойство, а не элемент управления как таковой), и у него нет доступа к области правильного имени для используйте относительную привязку.
После некоторого дополнительного поиска я нашел эту статью , в которой подробно описывается этот эффект и предлагается реализация BindableToolTip.
Это может быть излишним, потому что у вас есть другие варианты - например, использование статического свойства в классе (как в ответе Dabblernl) или добавление нового свойства экземпляра к вашему Item
.
Вам следует проконсультироваться с типами привязки относительного источника (например, в этой шпаргалке ):
Таким образом, ваша привязка будет выглядеть примерно так:
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}, Path= GlobalText}
Почти правильный Якодер, и угадали неверный путь, Dabblernl;)
Ваш образ мышления правильный, и можно ссылаться на DataContext вашего ItemsControl
Вам не хватает DataContext свойство в пути:
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.GlobalText}
Вторая попытка;)
http://blogs.msdn.com/tom_mathews/archive/2006/11/06/binding-a-tooltip-in-xaml.aspx
Вот статья с той же проблемой. Они могут ссылаться на DataContext своего родительского элемента управления с помощью свойства PlacementTarget:
<ToolTip DataContext=”{Binding RelativeSource={RelativeSource Self},Path=PlacementTarget.Parent}”>
Если вы поместите DataContext на более глубокий уровень, вы избежите изменения своего Item DataContext
Второе предложение (Нил и Адам Смит) заключалось в том, что мы могли используйте PlacementTarget в привязке. Это хорошо, поскольку я фактически наследую DataContext уже со страницы, на которой размещен DataControl, и это позволит ToolTip получить доступ к исходному элементу управления. Однако, как заметил Адам, вы должны знать о структуре родитель / потомок в разметке:
Это случай, когда я думаю, что концептуально более уместно делать это в модели взгляда, чем в модели взгляда в любом случае. Выставьте информацию во всплывающей подсказке на вид как свойство элемента модели представления. Это позволяет представлению делать то, в чем оно хорош (представление свойств элемента), а модели представления делать то, в чем оно хорош (решение о том, какая информация должна быть представлена).