【问题标题】:Window does not show. WPF窗口不显示。 WPF
【发布时间】:2017-05-19 16:39:31
【问题描述】:

我创建了一个带有按钮的DataGridTemplateColumn。我用Command 绑定了它,但是在我点击它之后,什么也没有发生。但是,如果我将按钮移到 DataGrid 的外部,它可以正常工作。

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding MedCards}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding = "{Binding Id, Mode=TwoWay}"/>
        <DataGridTextColumn Header="ID клиента" Binding = "{Binding Client_Id, Mode = TwoWay}"/>
        <DataGridTextColumn Header="Вес" Binding = "{Binding Weight, Mode = TwoWay}"/>
      <!--  <DataGridTextColumn Header="Рекомендация" Binding = "{Binding Recommend, Mode = TwoWay}"/> -->
        <DataGridTemplateColumn Header="Рекомендация">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Command="{Binding Path=ShowRecommendCommand}" CommandParameter="{Binding Recommend}" Content="Посмотреть"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <!-- -->
            <DataGridTextColumn Header="Рост" Binding = "{Binding Height, Mode = TwoWay}"/>
        <DataGridTextColumn Header = "Проблемы" Binding = "{Binding Problems, Mode = TwoWay}"/>
        <DataGridTextColumn Header = "BodyType" Binding = "{Binding BodyType, Mode = TwoWay}"/>
    </DataGrid.Columns>
</DataGrid>

命令:

 private RelayCommand showRecommendCommand;
    public RelayCommand ShowRecommendCommand
    {
        get
        {
            return showRecommendCommand ??
                (showRecommendCommand = new RelayCommand(obj =>
                {
                    RecommendViewModel viewModel = new RecommendViewModel();
                    viewModel.Recommend = Convert.ToString(obj);
                    RecommendWindow window = new RecommendWindow();
                    window.Show();
                }));
        }
    }

【问题讨论】:

    标签: c# wpf xaml binding


    【解决方案1】:

    您的Button 位于DataTemplate 内部,因此无法直接访问外部数据上下文。试试这个。

    给你的DataGrid 起个名字

    <DataGrid Name="myGrid" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding MedCards}">
    

    然后使用ElementName 访问绑定中的外部数据上下文。

    <Button Command="{Binding Path=DataContext.ShowRecommendCommand, ElementName=myGrid}" CommandParameter="{Binding Recommend}" Content="Посмотреть"/>
    

    另外,为了将来参考,调试时打开即时窗口以查看绑定错误。

    【讨论】:

    • 虽然解法是对的,但解释绝对不是。而且,绑定错误显示在输出窗口中,而不是立即显示。
    • @Yevgeniy 随意扩展您认为我的解释错误的原因。 Button 不在其父数据上下文中,因此您需要为其提供一种到达那里的方法。在 VS2015 中,绑定错误会输出到即时窗口,至少对我来说是这样。
    • 按钮位于其父数据上下文中。问题是它的数据上下文不是DataGrid数据上下文,而是存储在DataGrid Items源中的对象(具有Id、Client_Id、Weight等属性的类)。由于那里没有 ShowRecommendCommand 属性,因此绑定不起作用。如果你的解释是正确的,CommandParameter="{Binding Recommend}" 也不会起作用。
    • 据我了解,我上面提到的具有属性的类是 RecommendViewModel。如果是这样,使用 CommandParameter="{Binding}" 并将命令参数转换为 RecommendViewModel 将是一个更好的解决方案,因为不需要创建额外的 RecommendViewModel 实例。
    • @Yevgeniy 我没有说它有 no 数据上下文,我说它无法访问 outer 数据上下文,又名。 DataGrid 数据上下文。 {Binding Recommended} 是相对于项目上下文的,而不是父上下文,所以它没有理由不起作用。而且我不知道 OP 用例是什么,但没有迹象表明 MedCardsRecommendViewModel 的集合,因此绑定到对象本身可能无效。无论哪种方式,我的解释都没错,Button 无法直接访问其父数据上下文
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多