好的,我这里有一个奇怪的。我想弄清楚的是如何让一个由 ObservableCollection 填充的列表视图,根据第一个列表视图的选择更新另一个由另一个 ObservableCollection 填充的 ListView,然后使用 valueconverter 根据组合的选择来选中或取消选中复选框与第二个列表视图中的当前项目。这部分我通过使用多重绑定有点工作,但让我难过的部分是当我检查或取消选中第二个列表视图中的项目时,我需要能够获取该事件以及该列表视图中所有当前检查的项目更新基于此的数据库字段。
我知道这可能没有多大意义,我正在努力使其更清晰,但下面是两个列表视图的 xaml 和转换器的代码。我可以看到,当我选中或取消选中 secodn 列表视图中的一个框时,转换器尝试执行 ConvertBack 方法,但如果我将它设置为仅返回 null 则代码不再崩溃,但复选框被突出显示红色,就像发生了验证错误。
我什至不确定多重绑定是去这里的方式,我已经查看了 Josh Smith 的多选列表视图的东西,但是由于需要转换,我也看不出如何成功实现它。
如果有人有任何想法,我将不胜感激。如果我没有很清楚地解释我的需求,我也很抱歉,但我希望通过混乱的描述和代码,你可以看到我要去哪里。
提前致谢!
第一个提供第二个的 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 };
}}