C# 具有复选框的组合框项目,绑定到具有不同复选框的相同项目列表

C# 具有复选框的组合框项目,绑定到具有不同复选框的相同项目列表,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我正试图找出如何以一种更MVVMy的方式来实现这一点,但不知道该如何实现 我有一个组列表和一个数据库列表。对于每个组,我希望在其下方显示一个包含所有数据库的组合框,并且我希望检查数据库是否对特定组可用。我搞不懂的是如何通过某种绑定告诉数据库列表它连接到了哪个组 我有三个静态对象列表。 具有名称和ID的组 具有名称和ID的数据库 具有组id和对象id的外部参照 我的组控件如下所示 <UserControl x:Class="Support.Controls.GroupEdit&qu

我正试图找出如何以一种更MVVMy的方式来实现这一点,但不知道该如何实现

我有一个组列表和一个数据库列表。对于每个组,我希望在其下方显示一个包含所有数据库的组合框,并且我希望检查数据库是否对特定组可用。我搞不懂的是如何通过某种绑定告诉数据库列表它连接到了哪个组

我有三个静态对象列表。
具有名称和ID的组
具有名称和ID的数据库
具有组id和对象id的外部参照

我的组控件如下所示

<UserControl x:Class="Support.Controls.GroupEdit"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Support.Controls"
             xmlns:classes="clr-namespace:Support.Classes"
             mc:Ignorable="d" 
             d:DesignHeight="50" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=classes:Group}" DataContextChanged="UserControl_DataContextChanged">
  <UserControl.Resources>
    <classes:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
  </UserControl.Resources>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
      <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock FontWeight="Bold" Grid.Column="0" Grid.Row="0" Margin="2" Text="Name:" />
    <TextBox FontWeight="Bold" Grid.Column="1" Grid.Row="0" Margin="2" Text="{Binding Path=Name}" />
    <TextBlock Grid.Column="0" Grid.Row="1" Margin="2" />
    <local:DatabaseList DataContext="{Binding}" Grid.ColumnSpan="2" Grid.Row="2" Margin="2" x:Name="Databases" />
    <Button Click="Remove_Click"  Grid.Column="2" Grid.RowSpan="2" Name="Remove" ToolTip="Delete database" Visibility="{Binding Path=CanDelete, Converter={StaticResource BoolToVisibilityConverter}}">
      <Image Height="24" Margin="2" Name="AddNewImage" Source="../Images/Remove.png" />
    </Button>
  </Grid>
</UserControl>
<ComboBox x:Class="Support.Controls.DatabaseList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
             xmlns:classes="clr-namespace:Support.Classes" xmlns:controls="clr-namespace:Support.Controls"
             mc:Ignorable="d" d:DesignHeight="25" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=classes:Group}"
             DataContextChanged="ComboBox_DataContextChanged" SelectedIndex="0" SelectionChanged="ComboBox_SelectionChanged">
  <ComboBox.Resources>
    <CollectionViewSource x:Key="dbs" Source="{Binding Source={x:Static classes:CachedData.Databases}, Path=DatabaseList}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Name"  Direction="Ascending"/>
      </CollectionViewSource.SortDescriptions>
  </CollectionViewSource>
  </ComboBox.Resources>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <controls:DatabaseListItem DataContext="{Binding}"  />
    </DataTemplate>
  </ComboBox.ItemTemplate>
  <ComboBox.ItemsSource>
    <CompositeCollection>
      <ComboBoxItem Content="Selected Databases (0)" Name="SelectedDatabasesHeader" />
      <CollectionContainer Collection="{Binding Source={StaticResource dbs}}" />
    </CompositeCollection>
  </ComboBox.ItemsSource>
</ComboBox>
<ComboBoxItem x:Class="PostAuditSupport.Controls.DatabaseListItem"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:classes="clr-namespace:PostAuditSupport.Classes"
             mc:Ignorable="d" d:DesignHeight="25" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=classes:Database}"
             Selected="ComboBoxItem_Selected" x:Name="DatabaseComboBox">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <CheckBox Checked="Check_Checked" Grid.Column="0" HorizontalAlignment="Center" Margin="2" Name="Check" Unchecked="Check_Unchecked" VerticalAlignment="Center" />
    <TextBlock Grid.Column="1" Margin="2" Name="DatabaseName" Text="{Binding Path=Name}" VerticalAlignment="Center" />
  </Grid>
</ComboBoxItem>

我的数据库选择器控件如下所示:

<UserControl x:Class="Support.Controls.GroupEdit"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Support.Controls"
             xmlns:classes="clr-namespace:Support.Classes"
             mc:Ignorable="d" 
             d:DesignHeight="50" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=classes:Group}" DataContextChanged="UserControl_DataContextChanged">
  <UserControl.Resources>
    <classes:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
  </UserControl.Resources>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
      <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock FontWeight="Bold" Grid.Column="0" Grid.Row="0" Margin="2" Text="Name:" />
    <TextBox FontWeight="Bold" Grid.Column="1" Grid.Row="0" Margin="2" Text="{Binding Path=Name}" />
    <TextBlock Grid.Column="0" Grid.Row="1" Margin="2" />
    <local:DatabaseList DataContext="{Binding}" Grid.ColumnSpan="2" Grid.Row="2" Margin="2" x:Name="Databases" />
    <Button Click="Remove_Click"  Grid.Column="2" Grid.RowSpan="2" Name="Remove" ToolTip="Delete database" Visibility="{Binding Path=CanDelete, Converter={StaticResource BoolToVisibilityConverter}}">
      <Image Height="24" Margin="2" Name="AddNewImage" Source="../Images/Remove.png" />
    </Button>
  </Grid>
</UserControl>
<ComboBox x:Class="Support.Controls.DatabaseList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
             xmlns:classes="clr-namespace:Support.Classes" xmlns:controls="clr-namespace:Support.Controls"
             mc:Ignorable="d" d:DesignHeight="25" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=classes:Group}"
             DataContextChanged="ComboBox_DataContextChanged" SelectedIndex="0" SelectionChanged="ComboBox_SelectionChanged">
  <ComboBox.Resources>
    <CollectionViewSource x:Key="dbs" Source="{Binding Source={x:Static classes:CachedData.Databases}, Path=DatabaseList}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Name"  Direction="Ascending"/>
      </CollectionViewSource.SortDescriptions>
  </CollectionViewSource>
  </ComboBox.Resources>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <controls:DatabaseListItem DataContext="{Binding}"  />
    </DataTemplate>
  </ComboBox.ItemTemplate>
  <ComboBox.ItemsSource>
    <CompositeCollection>
      <ComboBoxItem Content="Selected Databases (0)" Name="SelectedDatabasesHeader" />
      <CollectionContainer Collection="{Binding Source={StaticResource dbs}}" />
    </CompositeCollection>
  </ComboBox.ItemsSource>
</ComboBox>
<ComboBoxItem x:Class="PostAuditSupport.Controls.DatabaseListItem"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:classes="clr-namespace:PostAuditSupport.Classes"
             mc:Ignorable="d" d:DesignHeight="25" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=classes:Database}"
             Selected="ComboBoxItem_Selected" x:Name="DatabaseComboBox">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <CheckBox Checked="Check_Checked" Grid.Column="0" HorizontalAlignment="Center" Margin="2" Name="Check" Unchecked="Check_Unchecked" VerticalAlignment="Center" />
    <TextBlock Grid.Column="1" Margin="2" Name="DatabaseName" Text="{Binding Path=Name}" VerticalAlignment="Center" />
  </Grid>
</ComboBoxItem>

最后,我的数据库控件如下所示

<UserControl x:Class="Support.Controls.GroupEdit"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Support.Controls"
             xmlns:classes="clr-namespace:Support.Classes"
             mc:Ignorable="d" 
             d:DesignHeight="50" d:DesignWidth="200" d:DataContext="{d:DesignInstance Type=classes:Group}" DataContextChanged="UserControl_DataContextChanged">
  <UserControl.Resources>
    <classes:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
  </UserControl.Resources>
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
      <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition />
    </Grid.RowDefinitions>
    <TextBlock FontWeight="Bold" Grid.Column="0" Grid.Row="0" Margin="2" Text="Name:" />
    <TextBox FontWeight="Bold" Grid.Column="1" Grid.Row="0" Margin="2" Text="{Binding Path=Name}" />
    <TextBlock Grid.Column="0" Grid.Row="1" Margin="2" />
    <local:DatabaseList DataContext="{Binding}" Grid.ColumnSpan="2" Grid.Row="2" Margin="2" x:Name="Databases" />
    <Button Click="Remove_Click"  Grid.Column="2" Grid.RowSpan="2" Name="Remove" ToolTip="Delete database" Visibility="{Binding Path=CanDelete, Converter={StaticResource BoolToVisibilityConverter}}">
      <Image Height="24" Margin="2" Name="AddNewImage" Source="../Images/Remove.png" />
    </Button>
  </Grid>
</UserControl>
<ComboBox x:Class="Support.Controls.DatabaseList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
             xmlns:classes="clr-namespace:Support.Classes" xmlns:controls="clr-namespace:Support.Controls"
             mc:Ignorable="d" d:DesignHeight="25" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=classes:Group}"
             DataContextChanged="ComboBox_DataContextChanged" SelectedIndex="0" SelectionChanged="ComboBox_SelectionChanged">
  <ComboBox.Resources>
    <CollectionViewSource x:Key="dbs" Source="{Binding Source={x:Static classes:CachedData.Databases}, Path=DatabaseList}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="Name"  Direction="Ascending"/>
      </CollectionViewSource.SortDescriptions>
  </CollectionViewSource>
  </ComboBox.Resources>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <controls:DatabaseListItem DataContext="{Binding}"  />
    </DataTemplate>
  </ComboBox.ItemTemplate>
  <ComboBox.ItemsSource>
    <CompositeCollection>
      <ComboBoxItem Content="Selected Databases (0)" Name="SelectedDatabasesHeader" />
      <CollectionContainer Collection="{Binding Source={StaticResource dbs}}" />
    </CompositeCollection>
  </ComboBox.ItemsSource>
</ComboBox>
<ComboBoxItem x:Class="PostAuditSupport.Controls.DatabaseListItem"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:classes="clr-namespace:PostAuditSupport.Classes"
             mc:Ignorable="d" d:DesignHeight="25" d:DesignWidth="300" d:DataContext="{d:DesignInstance Type=classes:Database}"
             Selected="ComboBoxItem_Selected" x:Name="DatabaseComboBox">
  <Grid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <CheckBox Checked="Check_Checked" Grid.Column="0" HorizontalAlignment="Center" Margin="2" Name="Check" Unchecked="Check_Unchecked" VerticalAlignment="Center" />
    <TextBlock Grid.Column="1" Margin="2" Name="DatabaseName" Text="{Binding Path=Name}" VerticalAlignment="Center" />
  </Grid>
</ComboBoxItem>


这里似乎有一些需要删除的静态类。使用MvvM,您不需要这些自定义控件。您的数据库选择器只不过是一个组合框。它应该从视图模型中获取信息。您的数据库控件只不过是一个组合框项,它的数据上下文应该位于视图模型中的ObservableCollection中,并且它应该是一个数据模板而不是自定义控件。评论部分不足以描述该做什么。谢谢,很公平。我正在慢慢地尝试将更多的内容转换为绑定,但我担心这可能需要对程序的结构进行一次大的重写。与其一次完成全部工作,不如分步骤开始。不使用自定义控件将是一个良好的开端。不要创建视图模型,而是开始在代码隐藏中分离这些问题,并使用绑定来访问这些问题。但是一步一个脚印,你就会到达那里。