自定义ListView项目中的背景/前景功能

时间:2018-07-02 20:53:55

标签: c# wpf xaml listview data-binding

我有以下功能代码将GridViewColumns绑定到自定义类的数据:

<ListView Name="lv">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First" DisplayMemberBinding="{Binding lvi.firstName}"/>
            <GridViewColumn Header="Last" DisplayMemberBinding="{Binding lvi.lastName}"/>
        </GridView>
    </ListView.View>
</ListView>

public class LVItemBox {
    public LVItem lvi { get; set; }
}
public class LVItem : INotifyPropertyChanged {
    private string _firstName;
    private string _lastName;
    public string firstName {
        get { return _firstName; }
        set { SetField(ref _firstName, value); }
    }
    public string lastName {
        get { return _lastName; }
        set { SetField(ref _lastName, value); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public virtual void OnPropertyChanged(string propertyName) {PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    public bool SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null) { if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }
}
public partial class MainWindow : Window {
    public MainWindow() {
        InitializeComponent();
        LVItem lvi1 = new LVItem {firstName = "John", lastName = "Doe"};
        LVItem lvi2 = new LVItem {firstName = "Jane", lastName = "Smith"};
        lv.Items.Add(new LVItemBox {lvi = lvi1});
        lv.Items.Add(new LVItemBox {lvi = lvi2});
    }
}

我的困境是我希望在Brush中具有背景/前景LVItemBox的功能,但是如果我使LVItemBox扩展Control,则更改Background / {{ 1}}无效:

Foreground

此外,如果我扩展public class LVItemBox : Control { public LVItem lvi { get; set; } // data displays } ... ... private void changeBackground(object sender, EventArgs e) { LVItemBox lvib = (LVItemBox)lv.Items[0]; lvib.Background = Brushes.Black; // doesn't work } 而不是ListViewItem,我可以使后台更改生效,但是数据绑定不再起作用。

Control

您知道如何在public class LVItemBox : ListViewItem { public LVItem lvi { get; set; } // data doesn't display } ... ... private void changeBackground(object sender, EventArgs e) { LVItemBox lvib = (LVItemBox)lv.Items[0]; lvib.Background = Brushes.Black; // works } 中获得前台/后台功能吗?

1 个答案:

答案 0 :(得分:2)

如果将以下Control添加到XAML,则可以从ItemContainerStyle继承:

<ListView Name="lv">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="First" DisplayMemberBinding="{Binding lvi.firstName}"/>
            <GridViewColumn Header="Last" DisplayMemberBinding="{Binding lvi.lastName}"/>
        </GridView>
    </ListView.View>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Background" Value="{Binding Background}" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>