1

ListView 内の ListViewItem 内の行の CellTemplate で定義された DataTrigger があります。それが含まれる行全体を選択するにはどうすればよいですか?

4

2 に答える 2

2

で行を選択しないでくださいDataTrigger。代わりにビュー モデルで選択します。

a) プロパティを定義し、基づく IsSelected条件が true になったときに、このプロパティ値を変更します。DataTrigger

public class DiabloIICharacter : ViewModelBase
{
    public String Name
    {
        get { return name; }
        set
        {
            if (name != value)
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }
    }
    private String name;

    public Boolean IsBoss
    {
        get { return isBoss; }
        set
        {
            if (isBoss != value)
            {
                isBoss = value;
                OnPropertyChanged("IsBoss");

                if (isBoss)
                    // when a character becomes a boss, it becomes selected too
                    IsSelected = true;
            }
        }
    }
    private Boolean isBoss;

    public Boolean IsSelected
    {
        get { return isSelected; }
        set
        {
            if (isSelected != value)
            {
                isSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }
    }
    private Boolean isSelected;
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new[]
        {
            new DiabloIICharacter { Name = "Diablo", IsBoss = true },
            new DiabloIICharacter { Name = "Oblivion Knight", IsBoss = false },
            new DiabloIICharacter { Name = "Blood Lord", IsBoss = false },
            new DiabloIICharacter { Name = "Andariel", IsBoss = true },
            new DiabloIICharacter { Name = "Baal", IsBoss = true },
            new DiabloIICharacter { Name = "Minion of Destruction", IsBoss = false },
            new DiabloIICharacter { Name = "Megademon", IsBoss = false },
        };
    }
}

b) バインドListViewItem.IsSelectedおよびViewModel.IsSelected経由ItemContainerStyle:

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" 
        SizeToContent="WidthAndHeight">
    <Grid>
        <ListView ItemsSource="{Binding}">
            <ListView.Resources>
                <DataTemplate x:Key="IsBossTemplate">
                    <Rectangle Fill="Red" Width="50" Height="20" x:Name="IsBossMark"/>
                    <DataTemplate.Triggers>
                        <DataTrigger Value="True" Binding="{Binding IsBoss}">
                            <Setter TargetName="IsBossMark" Property="Fill" Value="DarkRed"/>
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </ListView.Resources>
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Character name"
                                    DisplayMemberBinding="{Binding Name}"/>
                    <GridViewColumn Header="Is boss" 
                                    CellTemplate="{StaticResource IsBossTemplate}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>
于 2012-08-22T07:58:40.513 に答える
1

ListView に Name を適用するだけです。今のよう<ListView Name="mylistView"... />に、このようにセルテンプレートにバインディングを作成するだけで {Binding SelectedItem, ElementName=mylistView}、選択したアイテムにバインディングできます

于 2012-08-22T08:06:23.597 に答える