Привязка команд WPF ItemsControl в стилях - PullRequest
0 голосов
/ 11 июня 2018

У меня есть стиль в Textboxstyles.xaml, как указано ниже

<Style x:Key="EmptyItemsControlUsabilityDashboard2017Style" TargetType="ItemsControl">
        <Style.Triggers>
            <Trigger Property="HasItems" Value="false">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Control">
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <Image Height="12" Width="12" Source="/YoLo;component/Resources/Images/link.png" Margin="0,3,0,0" />
                            <TextBlock x:Name="EmptyCollectionTextBox" Text="{x:Static UsabilityDashboard2017Loc:DashboardUsability2017Resource.lblNumNotDefined}" 
                                       Style="{StaticResource UsabilityDashboard2017TextBoxStyle}"
                                       HorizontalAlignment="Center"
                                       Margin="5,25,0,25"/>
                            </StackPanel>
                    </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
 </Style>

, и я использовал его в другом файле Xaml, как показано ниже

 <ItemsControl ItemsSource="{Binding YoLoViewModelsCollection}" Name="YoLoViewModelsItemSource" Style="{StaticResource EmptyItemsControlUsabilityDashboard2017Style}">

Теперь он показывает текстовое поле, котороеэта коллекция пуста, но как я могу установить привязки команд к текстовому блоку с именем «EmptyCollectionTextBox» в стиле, когда пользователь щелкает его, выполняет команду?

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

1 Ответ

0 голосов
/ 11 июня 2018

На самом деле с этим кодом много чего не так.Во-первых, я понятия не имею, что должен делать этот триггер, похоже, что контрольная таблица будет установлена, только если в списке нет элементов?

Во-вторых, похоже, что вы пытаетесьпредставлять каждый элемент в коллекции с изображением и текстом, все в ItemsControl.Вы делаете это не с помощью шаблонов всего элемента управления, а с помощью шаблонов ItemTemplate.И вы используете DataTemplate, а не ControlTemplate:

Теперь, возвращаясь к вашему актуальному вопросу, вы хотите получать уведомления при каждом нажатии TextBlock.Существует множество различных способов сделать это, но в этом случае вы также можете заменить этот TextBlock на кнопку, а затем переопределить шаблон на ControlTemplate, который представляет его как TextBlock.Это дает вам лучшее из обоих миров: с точки зрения графического интерфейса это все еще текстовый блок, но вы по-прежнему получаете все уведомления о нажатиях кнопок и обработчик команд и т. Д .:

<Image />

<Button Command="{Binding ClickedCommand}" Cursor="Hand">
    <Button.Template>
        <ControlTemplate>
            <TextBlock Text="Text Binding Goes Here" />
        </ControlTemplate>
    </Button.Template>
</Button>

В этом конкретном примере предполагается, что элементы вваша коллекция имеет обработчик команд под названием «ClickedCommand».На практике ваш обработчик может находиться в родительском классе (например, в модели представления основного окна), и в этом случае вам нужно будет указать топор главного окна: Name (например, "_this") и вместо этого связать его, передав элемент вкак CommandParameter, чтобы он знал, какой из них был нажат:

<Button Command="{Binding ElementName=_this, Path=DataContext.ClickedCommand}" CommandParameter="{Binding}" Cursor="Hand">

И тогда ваша модель основного вида имеет обработчик, который выглядит примерно так:

    public ICommand ClickedCommand { get { return new RelayCommand<YourCollectionItemType>(OnClicked); } }
    private void OnClicked(YourCollectionItemType item)
    {
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...