C# 具有复选框的组合框项目,绑定到具有不同复选框的相同项目列表
我正试图找出如何以一种更MVVMy的方式来实现这一点,但不知道该如何实现 我有一个组列表和一个数据库列表。对于每个组,我希望在其下方显示一个包含所有数据库的组合框,并且我希望检查数据库是否对特定组可用。我搞不懂的是如何通过某种绑定告诉数据库列表它连接到了哪个组 我有三个静态对象列表。C# 具有复选框的组合框项目,绑定到具有不同复选框的相同项目列表,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我正试图找出如何以一种更MVVMy的方式来实现这一点,但不知道该如何实现 我有一个组列表和一个数据库列表。对于每个组,我希望在其下方显示一个包含所有数据库的组合框,并且我希望检查数据库是否对特定组可用。我搞不懂的是如何通过某种绑定告诉数据库列表它连接到了哪个组 我有三个静态对象列表。 具有名称和ID的组 具有名称和ID的数据库 具有组id和对象id的外部参照 我的组控件如下所示 <UserControl x:Class="Support.Controls.GroupEdit&qu
具有名称和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中,并且它应该是一个数据模板而不是自定义控件。评论部分不足以描述该做什么。谢谢,很公平。我正在慢慢地尝试将更多的内容转换为绑定,但我担心这可能需要对程序的结构进行一次大的重写。与其一次完成全部工作,不如分步骤开始。不使用自定义控件将是一个良好的开端。不要创建视图模型,而是开始在代码隐藏中分离这些问题,并使用绑定来访问这些问题。但是一步一个脚印,你就会到达那里。