Как установить флажок в ListView из кода - WPF - PullRequest
0 голосов
/ 12 июня 2018

У меня есть ListView с флажками вроде этого:

<ListView 
    x:Name="usersListView"
    Width="300"
    ItemsSource="{Binding}"
    IsSynchronizedWithCurrentItem="True"
    SelectionChanged="childrenListView_SelectionChanged"
    Background="{StaticResource BackgroundPrimaryBrush}"
    Foreground="{StaticResource WhiteBrush}"
    Grid.Row="6" Grid.ColumnSpan="2"
    >
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox Tag="{Binding Id}" IsChecked="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding FullName}" Header="Name" Width="250"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

Все флажки в ListView взяты из списка «AllUsers» из базы данных.Теперь я хочу установить конкретные флажки IsChecked = True в коде позади.У меня есть еще один список «Дети», в котором только несколько элементов «AllUsers».Я хочу отобразить ListView с установленным флажком, привязанным к Persons в «Children».

Я попытался реализовать это самостоятельно с помощью встроенной оболочки INotifyPropertyChanged для Person, но я не смог правильно связать это с этим.

Надеюсь, я правильно объяснил проблему.Заранее спасибо:)

1 Ответ

0 голосов
/ 13 июня 2018

Рассмотрите возможность использования IMultiValueConverter.

В приведенном ниже примере мой Children объект представляет собой простую строку с именем.У меня есть два списка, список AllChildrens и список SelectedChildrens .

Foreach в коллекции AllChildrens , конвертер проверяет, является ли элементсодержится в коллекции SelectedChildrens .

XAML: (я удалил события)

<ListView ItemsSource="{Binding AllChildrens}" Tag="{Binding SelectedChildrens}">
    <ListView.Resources>
        <local:IEnumerableContainsConverter x:Key="Contains" />
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox Content="{Binding}">
                                <CheckBox.IsChecked>
                                    <MultiBinding Converter="{StaticResource Contains}">
                                        <Binding Path="." />
                                        <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListView}}" Path="Tag" />
                                    </MultiBinding>
                                </CheckBox.IsChecked>
                            </CheckBox>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn DisplayMemberBinding="{Binding FullName}" Header="Name" Width="250"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

ViewModel:

public class Model
{
    public Model()
    {
        AllChildrens = new List<string>()
        {
            "James",
            "Annabelle",
            "Kevin",
            "William",
            "Joseph",
        };

        SelectedChildrens = new List<string>()
        {
            "James",
            "Annabelle",
            "William",
        };
    }

    public List<string> AllChildrens { get; set; }
    public List<string> SelectedChildrens { get; set; }
}

Конвертер:

class IEnumerableContainsConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values != null &&
            values.Length == 2 &&
            values[0] is string current_children && // Replace with your children object type
            values[1] is IEnumerable<string> selected) // Replace with your children object type
        {
            return selected.Contains(current_children);
        }

        return false;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...