Привязка данных внутри шаблона данных в UWP - PullRequest
0 голосов
/ 04 марта 2020

У меня есть usercontrol следующим образом, который имеет DataTemplate. Я хочу связать данные внутри DataTemplate со свойством внутри DataContext. В Uwp, к сожалению, у них нет предков, как я могу заставить свою вещь работать. Я ссылался на этот пост Привязка данных UWP: Как установить команду кнопки для родительского DataContext внутри DataTemplate , но она не работает. Пожалуйста помоги.

UserControl:

<local:CommonExpanderUserControl>
<local:CommonExpanderUserControl.ExpanderContent>
 <DataTemplate x:DataType="Data:VmInstrumentSettingsLocal">
<StackPanel>
<TextBlock Text="{Binding LisLocalSettings.SomeText}"/>
<controls:ButtonBadged x:Name="ButtonApplyLisLocalChanges" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2"
                                               x:Uid="/Application.GlobalizationLibrary/Resources/InstrumentSettingsViewButtonApply"
                                               HorizontalAlignment="Center"
                                               Margin="8"
                                               Command="{Binding LisLocalSettings.SaveLisSettings}"/>
</StackPanel>
</DataTemplate>
</local:CommonExpanderUserControl.ExpanderContent>
</CommonExpanderUserControl>

В моем UserControl xaml.cs следующим образом. Я хочу привязать команду кнопки к свойству Command внутри LisLocalSettings, но она не будет работать.

public InstrumentSetupLocalSettingsView()
        {
            this.InitializeComponent();
            DataContext = this;
        }
 public static readonly DependencyProperty LisLocalSettingsProperty = DependencyProperty.Register(
            nameof(LisLocalSettings),
            typeof(VmInstrumentSettingsLisLocal), 
            typeof(InstrumentSetupLocalSettingsView), 
            new PropertyMetadata(default(VmInstrumentSettingsLisLocal)));

        public VmInstrumentSettingsLisLocal LisLocalSettings
        {
            get => (VmInstrumentSettingsLisLocal) GetValue(LisLocalSettingsProperty);
            set => SetValue(LisLocalSettingsProperty, value);
        }

1 Ответ

0 голосов
/ 04 марта 2020

Привязка данных внутри шаблона данных в UWP

Вы можете поместить Command в источник данных, но если источник данных является сборником, нам нужно реализовать несколько экземпляров команды. Обычно мы помещаем команду в текущий DataContext, который можно использовать повторно. Для подробных шагов, пожалуйста, обратитесь к следующему.

<Page.Resources>
    <DataTemplate x:Key="HeaderTemplate">
        <StackPanel
            x:Name="ExpanderHeaderGrid"
            Margin="0"
            Padding="0"
            HorizontalAlignment="Stretch"
            Background="Red"
            Orientation="Vertical"
            >
            <TextBlock x:Name="TextBlockLisSharedSettingsTitle" Text="{Binding}" />
            <Button Command="{Binding ElementName=RootGrid, Path=DataContext.BtnCommand}" Content="{Binding}" />
        </StackPanel>
    </DataTemplate>
</Page.Resources>
<Grid x:Name="RootGrid">
    <uwpControls:Expander Header="hello" HeaderTemplate="{StaticResource HeaderTemplate}" />
</Grid>

Код сзади

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = this;
    }
    public ICommand BtnCommand
    {
        get
        {
            return new CommadEventHandler<object>((s) => BtnClick(s));
        }
    }

    private void BtnClick(object s)
    {

    }
}
public class CommadEventHandler<T> : ICommand
{
    public event EventHandler CanExecuteChanged;

    public Action<T> action;
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public void Execute(object parameter)
    {
        this.action((T)parameter);
    }
    public CommadEventHandler(Action<T> action)
    {
        this.action = action;

    }
}
...