Как привязать команду к флажку в таблице данных в пользовательском элементе управления? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть пользовательский элемент управления с DataTemplate внутри. В DataTemplate есть флажок, к которому я хочу привязать команду. Я создал свойство зависимости для привязки команды, но я не могу определить правильный синтаксис XAML для привязки команды из XAML в представлении к флажку в пользовательском элементе управления. Затем сам пользовательский элемент управления используется в DataTemplate в представлении. Я ищу лучший способ привязать команду из модели представления к этому пользовательскому элементу управления. Независимо от того, как я go об этом, я не могу успешно привязать команду.

Пользовательский элемент управления XAML

<UserControl
    ...
    x:Name="orderTreeItemControl"
    mc:Ignorable="d">

    <UserControl.Resources>        
        <DataTemplate x:Name="LocationTemplate" x:DataType="model:Location">            
            <StackPanel Orientation="Horizontal">
                <CheckBox Command="{}" IsChecked="{x:Bind IsSelected, Mode=TwoWay}" Padding="5" MinWidth="0" />
                <TextBlock Text="{x:Bind LocationName}" Margin="{StaticResource XXSmallTopRightBottomMargin}" />
                ...
            </StackPanel>            
        </DataTemplate>
    ...
    </UserControl.Resources>
    <Grid>
        <ContentControl  x:Name="MainContent"/>
    </Grid>
</UserControl>

Код пользовательского элемента управления позади:

public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command1", typeof(ICommand), typeof(OrderTreeItemControl), new PropertyMetadata(null, new PropertyChangedCallback(Data_Changed)));
public ICommand Command1
{
    get { return (ICommand)GetValue(CommandProperty); }
    set { SetValue(CommandProperty, value); }
}

Просмотр XAML

 <Page.Resources>
    <DataTemplate x:Key="BaseTemplate" x:DataType="model:OpenOrdersBase">
        <winui:TreeViewItem
            ItemsSource="{x:Bind Children}"
            IsExpanded="{x:Bind IsExpanded, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <controls1:OrderTreeItemControl Command1="{Binding DataContext.PickToggle, RelativeSource={RelativeSource Mode=Self}  }" Data="{Binding}">
                
            </controls1:OrderTreeItemControl>
        </winui:TreeViewItem>                                                 
    </DataTemplate>  

Обновление:

Я попытался применить решение, предложенное Файвангом, и попытался привязать свойство Command1 к представлению двумя разными способами. Он по-прежнему не связывает команду правильно.

Просмотр попытки XAML 1:

 <Page.Resources>
    <DataTemplate x:Key="BaseTemplate" x:DataType="model:OpenOrdersBase">
        <winui:TreeViewItem
            ItemsSource="{x:Bind Children}"
            IsExpanded="{x:Bind IsExpanded, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <controls1:OrderTreeItemControl Command1="{Binding DataContext.PickToggle, RelativeSource={RelativeSource Mode=Self}  }" Data="{Binding}">
                
            </controls1:OrderTreeItemControl>
        </winui:TreeViewItem>                                                 
    </DataTemplate> 

Просмотр попытки XAML 2 (добавлено x: имя на страницу):

 <Page.Resources>
    <DataTemplate x:Key="BaseTemplate" x:DataType="model:OpenOrdersBase">
        <winui:TreeViewItem
            ItemsSource="{x:Bind Children}"
            IsExpanded="{x:Bind IsExpanded, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <controls1:OrderTreeItemControl Command1="{Binding ElementName=PickSheetManager, Path=ViewModel.PickToggle}" Data="{Binding}">
                
            </controls1:OrderTreeItemControl>
        </winui:TreeViewItem>                                                 
    </DataTemplate>  

1 Ответ

0 голосов
/ 22 июня 2020

Вы можете использовать свойство Binding.ElementName , чтобы получить имя вашего пользовательского элемента управления для использования в качестве источника привязки для Binding. Затем вы можете получить доступ к его свойству Command1 и связать его с помощью CheckBox. Например:

.xaml:

<UserControl
    ...
    x:Name="orderTreeItemControl"
    mc:Ignorable="d">

    <UserControl.Resources>
        <DataTemplate x:Name="LocationTemplate" x:DataType="local:Location">
            <StackPanel Orientation="Horizontal">
                <CheckBox Command="{Binding ElementName=orderTreeItemControl,Path=Command1}" IsChecked="{Binding IsSelected, Mode=TwoWay}" Padding="5" MinWidth="0" />
                <TextBlock Text="{Binding LocationName}"  />
            
            </StackPanel>
        </DataTemplate>
       
    </UserControl.Resources>    

    ......
</UserControl>
...