【问题标题】:Binding clicker to VM in DataTemplate UWP在 DataTemplate UWP 中将点击器绑定到 VM
【发布时间】:2018-05-04 12:40:49
【问题描述】:

我有导航视图,我在其中定义 CommandBar。在 CommandBar 中,实现了两个 AppBarButton:

        <NavigationView x:Name="NavView">
            <NavigationView.HeaderTemplate>
                <DataTemplate>
                    <Grid Margin="24,10,0,0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBlock
                            Margin="0,0,0,10"
                            VerticalAlignment="Bottom"
                            FontSize="28"
                            Style="{StaticResource TitleTextBlockStyle}"
                            Text="{Binding}" />
                        <CommandBar
                            Grid.Column="1"
                            Margin="0,0,10,0"
                            HorizontalAlignment="Right"
                            VerticalAlignment="Bottom"
                            DefaultLabelPosition="Right">
                            <AppBarButton
                                Icon="Edit"
                                Label="Feedback" />
                            <AppBarButton
                                Icon="OtherUser"
                                Label="ChangeUser" />
                        </CommandBar>
                    </Grid>
                </DataTemplate>
            </NavigationView.HeaderTemplate>

我想将 AppBarButtons 与 ViewModel 中的方法绑定,但我不能这样做。我尝试这样做:

<AppBarButton
    Icon="Edit"
    Label="Feedback"
    Click="{x:Bind ViewModel.Foo}"/>

但这行不通。编译时出现错误:对象引用未设置为对象的实例。 我尝试添加到&lt;DataTemplate x:DataType&gt;,并绑定到这样的方法:

<AppBarButton
        Icon="Edit"
        Label="Feedback"
        Click="{x:Bind Foo}"/>

它已编译,但在运行时抛出异常并消失导航标题。 请告诉我,如何将此 AppBarButtons 绑定到我的方法?

【问题讨论】:

    标签: c# binding uwp


    【解决方案1】:

    如果你想使用x:bind绑定HeaderTemplate中的按钮,你应该找到datacontext并绑定ViewModel。

    尝试新建一个 ViewModel 并将其设置为 datacontext。

    public class ViewModel
    {
        public void Foo()
        {
        }
    }
    
    
        public MainPage()
        {
            this.InitializeComponent();
    
            DataContext = new ViewModel();
        }
    

    您需要添加 dataType inhead。

    DataTemplate x:DataType="local:ViewModel"

    下面是xaml中的所有代码。

        <NavigationView x:Name="NavView">
            <NavigationView.HeaderTemplate>
                <DataTemplate x:DataType="local:ViewModel">
                    <Grid Margin="24,10,0,0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <TextBlock
                            Margin="0,0,0,10"
                            VerticalAlignment="Bottom"
                            FontSize="28"
                            Style="{StaticResource TitleTextBlockStyle}"
                            Text="{Binding}" />
                        <CommandBar
                            Grid.Column="1"
                            Margin="0,0,10,0"
                            HorizontalAlignment="Right"
                            VerticalAlignment="Bottom"
                            DefaultLabelPosition="Right">
                            <AppBarButton
                                Icon="Edit"
                                Label="Feedback" 
                                Click="{x:Bind Foo}"/>
                            <AppBarButton
                                Icon="OtherUser"
                                Label="ChangeUser" 
                                Click="{x:Bind Foo}"/>
                        </CommandBar>
                    </Grid>
                </DataTemplate>
            </NavigationView.HeaderTemplate>
            </NavigationView>
    

    请按F5运行。

    当您单击反馈时,您可以看到 xaml 调用 Foo。

    【讨论】:

    • 非常感谢,它正在工作!请告诉我,我们是否必须在使用 ViewModel 的任何地方定义 DataContext,或者,它实际上就像当前示例一样?
    • @Artem 对于你想使用 x:Bind 的好模式是使用 DataContext。但是你可以使用绑定来绑定元素属性。
    猜你喜欢
    • 2015-01-29
    • 2019-04-13
    • 2020-02-01
    • 1970-01-01
    • 2016-03-23
    • 2020-11-05
    • 2017-07-20
    • 2016-11-30
    • 2022-01-05
    相关资源
    最近更新 更多