c# - 自定义 ListView 项中的背景/前景功能

标签 c# wpf xaml listview data-binding

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

<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});
    }
}

我的困境是我想要 LVItemBox 中的背景/前景 Brush 功能,但是如果我让 LVItemBox 扩展 Control,改变Background/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 我可以让后台更改工作,但数据绑定(bind)不再工作。

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
}

知道如何在 LVItemBox 中获得前景/背景功能吗?

最佳答案

如果您将以下 ItemContainerStyle 添加到您的 XAML,则从 Control 继承会起作用:

<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>

关于c# - 自定义 ListView 项中的背景/前景功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51143591/

相关文章:

c# - 定义 iTween 路径时的恒速问题

c# - 什么是DenseVector?如何使用?

c# - 在 List<T> 中找不到 ToDictionary<TSource, TKey>

wpf - 如何对 WPF 工具包 DataGrid 上的 DataGridTemplateColumn 进行排序?

c# - 在C#中更改属性后,是否有一种简单的方法可以清空文本框?

c# - 从 Facebook C# SDK 的 V5 迁移到 V6

c# - WPF DataGrid 绑定(bind) DataGridCell 内容

c# - 在 VS 2013 中使用报表查看器

wpf - 通过两个级别绑定(bind)到 TemplatedParent

xaml - 在 UWP 应用程序中覆盖 Pivot 标题前景画笔(Win 10 RTM SDK)