Я видел некоторые ответы, касающиеся WP8 или других, однако, кажется, что нет триггеров в WP8.1 (Или я что-то не хватает?)Как связать команду с событием StackPanel или Grid?
У меня есть DataTemplate связаны с кодом (он является центром DataTemplate , и у меня есть смесь статических и динамических узлов, поэтому этот набор данных необходимо установить из кода).
Этот шаблон данных определен в отдельном файле xaml, он включает в себя список (или список) с другим набором данных, определенным для элементов.
Мне нужно связать команду на кране элемента или списке выбора (или что-то подобное). Однако событие нажатия, определенное в шаблоне, не вызывается, поэтому я думал о привязке команды к элементу пользовательского интерфейса, но они, похоже, не поддерживают Commands ни триггеры интерактивности.
Любая подсказка о том, как с этим справиться? :)
В приведенном ниже примере я не получаю событие Item_Tapped или ListBox_SelectionChanged, я бы в любом случае предпочел связать одну из них с командой в viewmodel.
<DataTemplate x:Key="HubSectionTemplate">
<Grid>
<ListBox ItemsSource="{Binding MyNodes}"
SelectionChanged="ListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="64" Tapped="Item_Tapped" >
<TextBlock Text="{Binding MyText}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</DataTemplate>
Это, как он используется в коде:
HubSection hs = new HubSection()
{
ContentTemplate = Application.Current.Resources[HUBSECTION_TEMPLATE] as DataTemplate,
DataContext = model,
Tag = model.UniqueId,
};
Hub.Sections.Insert(firstSectIdx + 1, hs);
public class Model
{
public Guid UniqueId {get;set;}
public List<ItemModel> MyNodes {get;set;}
}
public class ItemModel
{
public string MyText {get;set;}
}
PS: ItemModel определяется в другой сборке и поэтому не должны быть отредактированы (команда должна быть в классе модели, если это возможно)
--- EDIT ---
для того, чтобы упростить проблему, я использую следующие модели:
public class Model
{
public Guid UniqueId {get;set;}
public List<ItemModel> MyNodes {get;set;}
public ICommand MyCommand {get;set;}
}
public class ItemModel
{
Model _Model;
public ItemModel(Model m) {_Model = m; }
public string MyText {get;set;}
public ICommand MyCommand { get { return _Model.MyCommand; }}
}
И мое (временное) решение использовать кнопку в ItemTemplate:
<ListView.ItemTemplate>
<DataTemplate>
<Button HorizontalAlignment="Stretch" Command="{Binding TapCommand}" Height="64">
<TextBlock Text="{Binding MyText}" />
</Button>
</DataTemplate>
</ListView.ItemTemplate>
А что, вместо прямого использования StackPanel, оберните его стилизованной кнопкой? Таким образом, у вас есть привязка Button Command, которую вы можете использовать для перехвата кликов. Другое дело, вы просите выбрать элемент или выбор элемента. Остерегайтесь того, что они ведут себя по-другому, если вы выберете один и тот же элемент дважды, щелчок будет срабатывать, но селектин не изменится. –
Что касается поведения, это не имеет особого значения, поскольку я создаю что-то вроде файлового проводника, поэтому, если элемент прослушивается, что-то должно произойти и не может произойти дважды. Если я не найду другого варианта, я закончу использование кнопки, но мне не очень нравится использовать кнопку, когда она не должна быть такой. – Jean
Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –