2017-01-31 21 views
1

У меня есть приложение UWP C# с ListBox. Я установил свойство ListBox ItemContainerStyle в стиль в ресурсе. Я застрял, пытаясь добавить кнопку в ControlTemplate в стиле. Я не знаю, где добавить обработчик события Clicked или Tapped.Как добавить функциональную кнопку в listboxitem в UWP XAML

Я преобразовал код для использования UserControl, добавленного непосредственно в список, и он отлично работает, за исключением того, что VisualStateManager не работает в UserControl.

Таким образом, я могу получить функциональную кнопку с кодом для UserControl, и я могу заставить VisualStateManager работать и обрабатывать свою пользовательскую визуализацию для выбора ListBoxItem, но я не могу получить визуальные состояния, а также функциональную кнопку ,

Я не уверен, какой код показывать здесь, потому что, как я уже сказал, все, кроме кнопки, отлично работает со стилем, и все работает отлично с пользовательским контролем, за исключением визуальной обработки состояния.

Я прочитал все вопросы, которые я могу найти об этом, и ближайший, к которому я могу прийти, - это иметь функцию обработчика кнопки, но никто не говорит, к какому классу добавить ее; они просто показывают эту функцию не в любом контексте. И визуальная обработка состояния всегда, кажется, требует от разработчика обнаружения мыши, выбора и т. Д., Состояний, которые нужно обрабатывать в коде с обработчиком для каждого состояния для обнаружения, а затем вызова GoToState, чтобы заставить визуального менеджера состояний делать его вещь. Должен быть способ сделать это без всех этих поворотов и лишнего и, казалось бы, избыточного кода.

[Update]

настоящее время я использую стиль для ListBoxItem путем установки ItemContainerStyle. Кроме того, я пытаюсь связать параметр Command недавно добавленной кнопки. Это не работает. Вот XAML для стиля, показывающий только важные части (потому что все работает как ожидалось, кроме кнопки). Это показывает два текстовых поля и кнопку. Важно отметить, что привязка свойств Text элементов TextBox работает отлично, и текст отображается точно так, как ожидалось. это заставляет меня хотеть предположить, что источник привязки и материал пути установлены правильно. Но еще раз, я сорван, потому что команда связывания не работает, и никаких ошибок не сообщается при сборке или время выполнения:

<StackPanel Background="Transparent" Margin="0,0,0,0"> 
    <TextBlock FontSize="22" TextWrapping="Wrap" FontWeight="SemiLight" x:Name="Title" Text="{Binding Title}" Margin="12,4,24,6" Visibility="{Binding Title, Converter={StaticResource StringToVisibiltyConverter}}" Foreground="{Binding color}"/> 
    <TextBlock TextWrapping="Wrap" Visibility="{Binding SubTitle, Converter={StaticResource StringToVisibiltyConverter}}" x:Name="Subtitle" Text="{Binding SubTitle}" Margin="12,-6,24,6" Opacity="0.8" Foreground="{Binding color}"/> 
    <Button Command="{Binding ClickCommand}" CommandParameter="x">X</Button> 
</StackPanel> 

Вот код объекта, который я добавить в ListBox:

public class MultilineListboxItem : Object 
{ 
    public MultilineListboxItem() { ClickCommand = new _ClickCommand(); } 

    public string Title { get; set; } 
    public string SubTitle { get; set; } 
    public string Original { get; set; } 
    public override string ToString() { return Original; } 
    public SolidColorBrush color { get; set; } 

    _ClickCommand ClickCommand; 
} 

И, конечно же, определение класса _ClickCommand:

public class _ClickCommand : ICommand 
{ 
    public void Execute(object parameter) 
    { 
     Diagnostics.AppendDiagnostic("derf"); 
    } 


    public bool CanExecute(object parameter) 
    { 
     Diagnostics.AppendDiagnostic("derf"); 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 
} 

это мои собственные диагностические функции отчетности, не то, что в C# или WinRT.

Теперь, когда я вернусь к стилю, чтобы определить внешний вид элементов списка, визуальные состояния работают должным образом.

ответ

3

Попробуйте изменить ClickCommand общественному дому.

  • свойства вы используете в качестве обязательных свойств источника для привязки должны быть открытыми свойствами вашего класса. Явно определенный интерфейс свойства не могут быть доступны для целей привязки и не могут быть защищены, частные, внутренние или виртуальные свойства, которые не имеют базы .
  • Вы не можете привязываться к публичным полям.

ссылки:

+0

Сразу хочу отметить, что если вы используете 'х: Bind',' private' тоже работает. –