将组合框绑定到枚举和具有此枚举的 class 的 collection
Bind combobox to enum and collection of class that has this enum
我有一个 collection:
public static readonly DependencyProperty UserAutoCalculationTemplatesProperty = DependencyProperty.Register("UserAutoCalculationTemplates", typeof(ObservableCollection<AutoCalculationTemplate>), typeof(Options));
public ObservableCollection<AutoCalculationTemplate> UserAutoCalculationTemplates
{
get => (ObservableCollection<AutoCalculationTemplate>)GetValue(UserAutoCalculationTemplatesProperty);
set => SetValue(UserAutoCalculationTemplatesProperty, value);
}
自动计算模板Class:
public class AutoCalculationTemplate : INotifyPropertyChanged
{
private CalculationVariants _templateType;
public CalculationVariants TemplateType
{
get
{
return _templateType;
}
set
{
_templateType = value;
OnPropertyChanged(new PropertyChangedEventArgs("TemplateType"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
}
我的XAML。
<DataGrid ItemsSource="{Binding UserAutoCalculationTemplates, ElementName=OptionsWindow,Mode=TwoWay,NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Name="AutoCalculaionTemplates">
<DataGrid.Columns>
<DataGridTemplateColumn Header="">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="AutoCalculationTypeCombo"
ItemsSource="{Binding Source={enum:Enumeration {x:Type options:CalculationVariants}}}"
DisplayMemberPath="Description"
SelectedValue="{Binding UserAutoCalculationTemplates.TemplateType, ElementName=OptionsWindow,Mode=TwoWay,NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Value"
DropDownClosed="AutoCalculationTypeCombo_OnDropDownClosed"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGrid.Columns>
</DataGrid>
通过本主题的扩展绑定到枚举的组合框:Databinding an enum property to a ComboBox in WPF:
枚举:
public enum CalculationVariants
{
[Description("Внутренний")]
CalculateWithCSharp,
[Description("Внешний скрипт")]
CalculateWithPython,
[Description("Общий")]
Common
}
我想让 Combobox 做两件事:
- 在点击时显示所有可能的枚举值(它们的描述);
- 显示 UserAutoCalculationTemplatesProperty 中项目的 TemplateType 属性的当前值 collection(空闲)。
目前只做第一件事,不做第二件事,我该如何解决?
以下示例将 ComboBox.SelectedValue
绑定到 OptionsWindow
的 属性:
public static readonly DependencyProperty SelectedCalculationVariantsProperty = DependencyProperty.Register(
"SelectedCalculationVariants",
typeof(CalculationVariants),
typeof(Options));
public CalculationVariants SelectedCalculationVariants
{
get => (CalculationVariants) GetValue(SelectedCalculationVariantsProperty);
set => SetValue(SelectedCalculationVariantsProperty, value);
}
<DataGrid.Columns>
<DataGridTemplateColumn Header="">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="AutoCalculationTypeCombo"
ItemsSource="{Binding Source={enum:Enumeration {x:Type options:CalculationVariants}}}"
DisplayMemberPath="Description"
SelectedValue="{Binding SelectedCalculationVariants, ElementName=OptionsWindow, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Value"
DropDownClosed="AutoCalculationTypeCombo_OnDropDownClosed"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGrid.Columns>
我有一个 collection:
public static readonly DependencyProperty UserAutoCalculationTemplatesProperty = DependencyProperty.Register("UserAutoCalculationTemplates", typeof(ObservableCollection<AutoCalculationTemplate>), typeof(Options));
public ObservableCollection<AutoCalculationTemplate> UserAutoCalculationTemplates
{
get => (ObservableCollection<AutoCalculationTemplate>)GetValue(UserAutoCalculationTemplatesProperty);
set => SetValue(UserAutoCalculationTemplatesProperty, value);
}
自动计算模板Class:
public class AutoCalculationTemplate : INotifyPropertyChanged
{
private CalculationVariants _templateType;
public CalculationVariants TemplateType
{
get
{
return _templateType;
}
set
{
_templateType = value;
OnPropertyChanged(new PropertyChangedEventArgs("TemplateType"));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
}
我的XAML。
<DataGrid ItemsSource="{Binding UserAutoCalculationTemplates, ElementName=OptionsWindow,Mode=TwoWay,NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" Name="AutoCalculaionTemplates">
<DataGrid.Columns>
<DataGridTemplateColumn Header="">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
x:Name="AutoCalculationTypeCombo"
ItemsSource="{Binding Source={enum:Enumeration {x:Type options:CalculationVariants}}}"
DisplayMemberPath="Description"
SelectedValue="{Binding UserAutoCalculationTemplates.TemplateType, ElementName=OptionsWindow,Mode=TwoWay,NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Value"
DropDownClosed="AutoCalculationTypeCombo_OnDropDownClosed"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGrid.Columns>
</DataGrid>
通过本主题的扩展绑定到枚举的组合框:Databinding an enum property to a ComboBox in WPF:
枚举:
public enum CalculationVariants
{
[Description("Внутренний")]
CalculateWithCSharp,
[Description("Внешний скрипт")]
CalculateWithPython,
[Description("Общий")]
Common
}
我想让 Combobox 做两件事:
- 在点击时显示所有可能的枚举值(它们的描述);
- 显示 UserAutoCalculationTemplatesProperty 中项目的 TemplateType 属性的当前值 collection(空闲)。
目前只做第一件事,不做第二件事,我该如何解决?
以下示例将 ComboBox.SelectedValue
绑定到 OptionsWindow
的 属性:
public static readonly DependencyProperty SelectedCalculationVariantsProperty = DependencyProperty.Register(
"SelectedCalculationVariants",
typeof(CalculationVariants),
typeof(Options));
public CalculationVariants SelectedCalculationVariants
{
get => (CalculationVariants) GetValue(SelectedCalculationVariantsProperty);
set => SetValue(SelectedCalculationVariantsProperty, value);
}
<DataGrid.Columns>
<DataGridTemplateColumn Header="">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="AutoCalculationTypeCombo"
ItemsSource="{Binding Source={enum:Enumeration {x:Type options:CalculationVariants}}}"
DisplayMemberPath="Description"
SelectedValue="{Binding SelectedCalculationVariants, ElementName=OptionsWindow, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Value"
DropDownClosed="AutoCalculationTypeCombo_OnDropDownClosed"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGrid.Columns>