Возможность фона / переднего плана в пользовательских элементах ListView - PullRequest
0 голосов
/ 02 июля 2018

У меня есть следующий функциональный код, который связывает 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 extension 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, я смогу заставить работать изменение фона, но привязки данных больше не будут работать.

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?

1 Ответ

0 голосов
/ 03 июля 2018

Наследование от 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...