wpf 如何从listviewitem模板绑定命令

xsuvu9jc  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(213)

我在ResourceDictionary中有一些模板,就像这样:

<DataTemplate x:Key="DefaultOrderItem" DataType="{x:Type m:OrderItem}">
    <Grid>
        <!-- Row/Column definition and other TextBoxes omitted -->

        <Button Grid.Row="0" Grid.Column="0" Name="DecCount" Padding="5,0,5,0"
                Command="{Binding OnDecCount}" CommandParameter="{Binding}">&lt;</Button>
        <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding LabelCount, Mode=TwoWay}" FontSize="20"/>
        <Button Grid.Row="0" Grid.Column="2" Name="IncCount" Padding="5,0,5,0"
                Command="{Binding Path=OnIncCount}" CommandParameter="{Binding}">&gt;</Button>
        <Button Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" FontSize="20" Padding="5,0,5,0"
                Command="{Binding Path=DataContext.OnPrint}" CommandParameter="{Binding}"> Print </Button>

        <TextBox Grid.Row="0" Grid.Column="3" Grid.RowSpan="2" Text="{Binding PosNum}" VerticalAlignment="Center"
                 IsReadOnly="True" BorderThickness="0" FontSize="30" Background="Transparent"/>

        <TextBox Grid.Row="0" Grid.Column="10" Text="{Binding LabelType}" FontSize="20" VerticalAlignment="Center"/>
        <Button Grid.Row="1" Grid.Column="10" Name="Edit" Margin="3" FontSize="20" Padding="5,0,5,0"
                Command="{Binding OnEdit}" CommandParameter="{Binding}"> Edit </Button>
    </Grid>
</DataTemplate>

该模板由如下所示的UserControl使用:

<ListView Grid.Row="1" Name="lstItems"
          AlternationCount="2"
          ItemsSource="{Binding OrderItems}"
          ItemContainerStyle="{StaticResource alternatingWithBinding}"
          ItemTemplateSelector="{StaticResource OrderItemTemplateSelector}"/>

我读了很多关于命令绑定的文章,但没有一个对我有用。正如你所看到的,我尝试了不同的变体。我也尝试了不同的命令实现。我尝试了RelayCommand的成员,视图后面的代码中的函数,视图模型中的函数和模型中的函数(OrderItem类),但都没有触发。
所以我希望,有人能给我一束光。

后续注解(基于BionicCodes评论):* 我使用Viewmodel优先设计,这意味着,我加载ViewModel,相应的View由xaml声明中编写的依赖项加载。*

jyztefdp

jyztefdp1#

我在模型类中添加了类似的命令:

public ICommand CmdIncCounter
{
    get
    {
        if (_cmdIncCounter == null)
            _cmdIncCounter = new RelayCommand(IncrementCounter, CanIncrementCounter);

        return _cmdIncCounter;
    }
}

这是可行的,但有两点我想改变:

  • 第一:我不喜欢模型中的控制器代码。因此,如果有一种方法可以将命令移出模型类,我会很感激任何提示
  • 第二:当canExecute返回false时,按钮不会变为禁用状态。它可以工作,因为当canExecute返回false时,command不会执行,但是没有可视的用户反馈
yzxexxkh

yzxexxkh2#

DataTemplateDataContext * 总是 * 模板化数据项,在您的示例中是OrderItem。除非OrderItem定义了像OnDecCount这样的命令,否则绑定将无法解析。
您可以使用Binding.RelativeSource属性遍历元素树以找到正确的DataContext
下面的示例将Button.Command属性绑定到父UserControlDataContext中的OnDecCount属性。Button.CommandParameter是单击的OrderItem

<DataTemplate x:Key="DefaultOrderItem" DataType="{x:Type m:OrderItem}">
  <Button Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=DataContext.OnDecCount}" 
          CommandParameter="{Binding}" />
</DataTemplate>

相关问题