单击TreeView中的TextBlock更新View Model的IsSelectedProperty

时间:2013-12-03 09:29:34

标签: wpf mvvm

我刚刚从MVP Windows Forms的世界进入MVVM WPF世界,我正在尝试开发一个分析程序。

XAML:

<TreeView VerticalAlignment="Stretch"
          HorizontalAlignment="Stretch">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type local:ProfileViewModel}">
            <TextBlock Text="{Binding Name}"/>
        </DataTemplate>
    </TreeView.Resources>
    <TreeViewItem ItemsSource="{Binding Profiles}"
                  Header="Profiles"/>
    <TreeViewItem ItemsSource="{Binding Jobs}"
                  Header="Jobs"/>
</TreeView>

ProfileViewModel:

private Profile profile;

public string Name { get { return profile.Name; } }

private bool isSelected;
public bool IsSelected
{
    get
    {
        return this.isSelected;
    }
    set
    {
        this.isSelected = value;
        OnPropertyChanged("IsSelected");
    }
}

public ProfileViewModel(Profile profile)
{
    this.profile = profile;
}

基本上,我要做的是在选择TextBlock时将ProfileViewModel中的IsSelected属性设置为true,否则设置为false。我知道有可能提出这样的事件:

<TextBlock Text="{Binding Name}" PreviewMouseUp="MouseUpHandler/>

但我更喜欢它是否会直接自动更新ViewModel。有可能这样做吗?

3 个答案:

答案 0 :(得分:0)

您可以将TreeViewItem.IsSelected绑定到项目中的属性。

像这样:

<Style TargetType="TreeViewItem">
    <Setter Property="IsSelected" Value="{Binding Path=IsMarked}"/>
</Style>

每个TreeViewItem都会尝试绑定到其相应项目的名为IsMarked的属性。

尝试一下:)

答案 1 :(得分:0)

假设您的意思是在文本框聚焦时选择:

<TreeView VerticalAlignment="Stretch"
          HorizontalAlignment="Stretch">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type local:ProfileViewModel}">
            <TextBlock Text="{Binding Name}"
                       IsKeyboardFocusWithin="{Binding IsSelected, 
                                               Mode=OneWayToSource}">
        </DataTemplate>
    </TreeView.Resources>
    <TreeViewItem ItemsSource="{Binding Profiles}"
                  Header="Profiles"/>
    <TreeViewItem ItemsSource="{Binding Jobs}"
                  Header="Jobs"/>
</TreeView>

答案 2 :(得分:0)

试试这个:

<TreeView ItemsSource="{Binding YourItemCollection}" ... >
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type local:ProfileViewModel}">
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </TreeView.Resources>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

这是您使用@devhedgehog提供的Style的方法。任何集合控件的ItemContainerStyle始终是每个项目的“容器”的Style,在本例中为TreeViewItem