如何绑定到列表框中的特定属性

时间:2015-08-31 12:20:22

标签: c# wpf

我需要在第一次选择时更改列表项中文本的粗体。

的Xaml:

<DockPanel >
        <TextBox DockPanel.Dock="Top" Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}"></TextBox>
        <ListBox x:Name="list" ItemsSource="{Binding EmailsCollection}" SelectedItem="{Binding SelectedItem}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <Label Content="{Binding Sender}"  Name="SenderLabel" FontWeight="{Binding IsRead,  Converter={StaticResource Converter}}"/>
                        <!--Style="{StaticResource Sender}"-->
                        <Label Grid.Row="1" Content="{Binding Subject}" FontSize="12" HorizontalAlignment="Left" />
                        <Label Grid.Column="1" Content="{Binding Date}" FontSize="12" HorizontalAlignment="Right" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </DockPanel>

查看型号:

public Email SelectedItem
    {
        get
        {
            return _selectedItem;
        }

        set
        {
            _selectedItem = value;
            _selectedItem.IsRead = true;
            OnPropertyChanged(this,"SelectedItem");

        }
    }

型号:

public bool IsRead
    {
        get { return _isRead; }
        set
        {
            _isRead = value;
            OnPropertyChanged(this, "IsRead");
        }
    }

如何绑定列表中所选项目的“IsRead”属性? 当前的方式在开始时覆盖所有电子邮件,并且在之后不会改变任何内容。

1 个答案:

答案 0 :(得分:0)

只需使用DataTrigger而无需转换器

 <DockPanel >
        <TextBox DockPanel.Dock="Top" Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}"></TextBox>
        <ListBox x:Name="list" ItemsSource="{Binding EmailsCollection}" SelectedItem="{Binding SelectedItem}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <Label Content="{Binding Sender}"  Name="SenderLabel" >
                            <Label.Style>
                                <Style TargetType="Label">
                                    <Setter Property="FontWeight" Value="Normal"/>
                                    <Style.Triggers>                                            
                                        <DataTrigger Binding="{Binding IsRead}" Value="true">
                                            <Setter Property="FontWeight" Value="Bold"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Label.Style>                                
                        </Label> 
                        <!--Style="{StaticResource Sender}"-->
                        <Label Grid.Row="1" Content="{Binding Subject}" FontSize="12" HorizontalAlignment="Left" />
                        <Label Grid.Column="1" Content="{Binding Date}" FontSize="12" HorizontalAlignment="Right" />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </DockPanel>

更新:这里是相应的Model / ViewModel

  public class Email:INotifyPropertyChanged
{
    private bool _isRead;
    public bool IsRead
    {
        get { return _isRead; }
        set
        {
            _isRead = value;
            OnPropertyChanged();
        }
    }  
    private String _sender ;
    public String Sender
    {
        get
        {
            return _sender;
        }

        set
        {
            if (_sender == value)
            {
                return;
            }

            _sender = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public partial class MainWindow : Window,INotifyPropertyChanged
{

    private ObservableCollection<Email> _emailsCollection = new ObservableCollection<Email>(){new Email(){Sender = "FirstSender",IsRead = true},new Email(){Sender = "SecondSender",IsRead = false}};

    public ObservableCollection<Email> EmailsCollection
    {
        get
        {
            return _emailsCollection;
        }

        set
        {
            if (_emailsCollection == value)
            {
                return;
            }

            _emailsCollection = value;
            OnPropertyChanged();
        }
    }
    private Email _selectedItem=new Email(){IsRead = true};
    public Email SelectedItem
    {
        get
        {
            return _selectedItem;
        }

        set
        {
            _selectedItem = value;
            _selectedItem.IsRead = true;
            OnPropertyChanged();

        }
    }
    public MainWindow()
    {
        InitializeComponent();            
    }
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

输出

enter image description here