OK、ここに奇妙なものがあります。私が理解しようとしているのは、最初のリストビューの選択に基づいて、ObservableCollection によって取り込まれた 1 つのリストビューを作成し、別の ObservableCollection によって取り込まれた別の ListView を更新し、次に valueconverter を使用して、組み合わせた選択に基づいてチェックボックスをオンまたはオフにする方法です。 2 番目のリストビューに現在のアイテムが表示されます。この部分は、マルチバインディングを使用して多少作業していますが、困惑している部分は、2番目のリストビューでアイテムをチェックまたはチェック解除するときに、そのイベントとそのリストビューで現在チェックされているすべてのアイテムを取得できるようにする必要があることです。それに基づくデータベースフィールド。
私はこれがあまり意味をなさないかもしれないことを知っています. セカンドリストビューのチェックボックスをオンまたはオフにすると、コンバーターが ConvertBack メソッドを実行しようとして失敗することがわかりますが、単に null を返すように設定すると、コードは失敗しなくなりますが、チェックボックスは強調表示されます検証エラーが発生したように赤で。
マルチバインディングがここに行く方法であるかどうかさえわかりません.Josh Smithのマルチセレクションリストビューのものを見てきましたが、必要な変換では、それをうまく実装する方法もわかりません.
誰かが何かアイデアを持っているなら、私はそれを大いに感謝します. また、私の必要性を明確に説明しなかった場合は申し訳ありませんが、混沌とした説明とコードで、私がどこに向かっているのかを確認できることを願っています.
前もって感謝します!
2 番目の ListView にフィードする最初の 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>
コンバーターとマルチバインディングを使用した 2 番目の 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 };
}}