Хорошо, у меня есть странный здесь. Я пытаюсь понять, как иметь одно представление списка, заполненное ObservableCollection, обновить другое ListView, заполненное другим ObservableCollection, на основе выбора первого списка, а затем использовать преобразователь значений, чтобы установить или снять флажок на основе комбинированного выбора с текущим элементом во втором списке. В этой части я несколько работаю с использованием множественной привязки, но часть, которая ставит меня в тупик, - это когда я проверяю или снимаю флажок с элемента во втором представлении списка, мне нужно иметь возможность захватить это событие и все отмеченные в данный момент элементы в этом списке и обновить поле базы данных на основе этого.
Я знаю, что это может не иметь большого смысла, и я изо всех сил пытаюсь сделать это более понятным, но ниже приведен xaml для двух списков и код для преобразователя. Я вижу, что когда я устанавливаю или снимаю флажок в представлении списка secodn, конвертер пытается выполнить метод ConvertBack, который взрывается, но если я устанавливаю его просто для возврата null, тогда код больше не взрывается, но флажок подсвечивается красным цветом, как будто произошла ошибка проверки.
Я даже не уверен, что множественная привязка - это то, что нужно, и я просмотрел материал просмотра списка с множественным выбором Джоша Смита, но с необходимым преобразованием я также не вижу, как это реализовать успешно.
Если у кого-то есть идеи, я был бы очень признателен. Также мои извинения, если я не очень ясно объяснил свою потребность, но я надеюсь, что с хаотичным описанием и кодом вы сможете увидеть, к чему я иду.
Заранее спасибо!
Первый ListView, который передает второй
<Grid>
<ListView x:Name="listRule" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="3,3,3,3" ItemsSource="{Binding RuleListing}" exts:Selected.Command="{Binding RuleSelectedCommand}" SelectedIndex="0">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=DisplayName}" ToolTip="{Binding Path=Expression}" FontWeight="Bold"/>
<TextBlock Text=" ( "/>
<TextBlock Text="{Binding Description}" FontStyle="Italic" />
<TextBlock Text=" )"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
Второй ListView с конвертером и мультипривязкой
<Grid HorizontalAlignment="Stretch">
<Grid.Resources>
<converters:RuleToRoleBooleanConverter x:Key='RuleRoleConverter' />
<DataTemplate x:Key="RoleTemplate">
<Grid HorizontalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*" MinWidth="200"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding RoleName}" HorizontalAlignment="Left" Margin="3,0,0,0" Grid.Column="0" />
<CheckBox HorizontalAlignment="Right" Margin="0,0,3,0" Grid.Column="1">
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource RuleRoleConverter}">
<Binding ElementName="listRule" Path="SelectedItem" />
<Binding Path="RoleName"/>
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
</Grid>
</DataTemplate>
</Grid.Resources>
<ListView Name="listRoles" ItemsSource="{Binding RoleListing}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
SelectionMode="Multiple" ItemTemplate="{StaticResource ResourceKey=RoleTemplate}">
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsRoleSelected}"/>
</Style>
</ListView.ItemContainerStyle>
</ListView>
</Grid>
Конвертер значений
public class RuleToRoleBooleanConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values[0] != null && values[1] != null)
{
string expression = ((EliteExtenderRule)values[0]).Expression;
string role = values[1].ToString();
if (expression.Contains("R:*") || expression.Contains("R:" + role))
{
return true;
}
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return null;// new object[] { (bool)value, null };
}}