首页 > 解决方案 > 可点击的按钮来获取数据 wpf mvvm

问题描述

视图.Xaml

 <Grid>
        <ListView ItemsSource = "{Binding Path = dcCategory}" SelectedValuePath = "Key" SelectedValue = "{Binding Path = Category, Mode = TwoWay}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <StackPanel Orientation="Horizontal" >
                            <Button Content="Add Value" Command="{Binding Path=DataContext.AddValue, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"/>
                            <TextBlock Text="{Binding Path=Key.Name}"/>
                        </StackPanel>
                        <ListBox ItemsSource="{Binding Path=Value}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
        </ListView>
    </Grid>

我的目标是单击添加值并发送所选项目(类别类型)。它现在正在工作,但不像我接受的那样。Insted 只点击按钮,我必须点击第一个蓝色区域,然后用数据“捕捉”“类别”。否则类别为空。

例子

视图模型

private Category _Category;
public Category Category
{
    get
    {
        return _Category;
    }
    set
    {
        if (_Category != value)
        {
            _Category = value;
            OnPropertyChanged(() => Category);
        }
    }
}

    public ICommand AddValue
    {
        get
        {
            if (_AddValue == null)
            {
                _AddValue = new BaseCommand(() => Messenger.Default.Send(CategoryValueCode.AddValue + "," + Category.CategoryId));
            }
            return _AddValue;
        }
    }

标签: c#wpfmvvm

解决方案


这是逻辑,因为您的按钮命令将在ListView.SelectedValue设置之前执行。你可以改变它,如果你PreviewMouseDown处理Button. 我还发现最好设置ListView.SelectionModeSingle.

<ListView ItemsSource = "{Binding Path = dcCategory}" SelectedValuePath = "Key" SelectedValue = "{Binding Path = Category, Mode = TwoWay}" SelectionMode="Single">
<Button Content="Add Value" Command="{Binding Path=DataContext.AddValue, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" PreviewMouseDown="PreviewMouseDown"/>


private void PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    ListViewItem lvi = null;
    var visParent = VisualTreeHelper.GetParent(sender as FrameworkElement);
    while (lvi == null && visParent != null)
    {
        lvi = visParent as ListViewItem;
        visParent = VisualTreeHelper.GetParent(visParent);
    }
    if (lvi == null) { return; }
    lvi.IsSelected = true;
}

推荐阅读