繁体   English   中英

MVVM WPF 绑定在 ListView 上被 ItemContainerStyle 破坏

[英]MVVM WPF binding broken with ItemContainerStyle on ListView

当我将 ItemContainerStyle 应用到我的 ListView (GridView) 时,ItemSource 绑定显示对象名称而不是对象值。 本质上,当我应用容器样式时,绑定不再起作用。 我不明白为什么会这样,因为我仍然保留 DisplayMemeberBinding 到对象的属性。

这是示例代码:

模型:

public class Person
{
    public string Name { get; set; } = "Randy Orton";
    public int Age { get; set; } = 26;
    public bool Employed { get; set; } = true;

    public Person(string name, int age, bool employed)
    {
        Name = name;
        Age = age;
        Employed = Employed;
    }

    public Person()
    {
    }
}

视图模型:

public ObservableCollection<Person> People { get; set; }

    public ViewModel()
    {
        People = new ObservableCollection<Person> { new Person(), new 
        Person(), new Person() };
    }

看法:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }
}

xml:

    <Style x:Key="listviewitemStyle"
           TargetType="ListViewItem">
        <Style.Resources>
            <SolidColorBrush x:Key="HighlightTextBrushKey"
                 Color="Black" />
            <SolidColorBrush x:Key="HighlightBrushKey"
                 Color="#7d7d7d" />
            <SolidColorBrush x:Key="HighlightMouseOverBrushKey"
                 Color="{Binding Source={StaticResource HighlightBrushKey}, Path=Color}"
                 Opacity="0.3" />
            <SolidColorBrush x:Key="disabledTextBrushKey"
                             Color="#303030" />
            <SolidColorBrush x:Key="disabledBrushKey"
                             Color="#595959" />
        </Style.Resources>

        <Style.Setters>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListViewItem">
                        <Border BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}"
                         Margin="{TemplateBinding Margin}">
                            <ContentPresenter />
                        </Border>

                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="{StaticResource HighlightMouseOverBrushKey}" />
                                <Setter Property="Foreground" Value="{StaticResource HighlightTextBrushKey}" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="{StaticResource HighlightBrushKey}" />
                                <Setter Property="Foreground" Value="{StaticResource HighlightTextBrushKey}" />
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" Value="{StaticResource disabledBrushKey}" />
                                <Setter Property="Foreground" Value="{StaticResource disabledTextBrushKey}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>
</Window.Resources>

<Grid>
    <ListView
        ItemsSource="{Binding People, UpdateSourceTrigger=PropertyChanged}"
        ItemContainerStyle="{StaticResource listviewitemStyle}">

        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="auto" DisplayMemberBinding="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
                <GridViewColumn Header="Age" Width="auto" DisplayMemberBinding="{Binding Age, UpdateSourceTrigger=PropertyChanged}" />
                <GridViewColumn Header="Employed" Width="auto" DisplayMemberBinding="{Binding Employed, UpdateSourceTrigger=PropertyChanged}" />
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

要解决此问题,只需将 ControlTemplate 中的ContentPresenter更改为GridViewRowPresenter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM