【问题标题】:WPF C# - Binding Enum to ComboBoxWPF C# - 将枚举绑定到组合框
【发布时间】:2020-02-07 07:57:08
【问题描述】:

我有一个包含以下选项的组合框:“HardDelete”、“SoftDelete”、“MoveToDeletedItems”

我希望默认选择与 EmailAction 对象的以下属性相匹配:

public DeleteMode DeleteMode { get; set; }

这是我用来尝试设置的代码行:

cmboDelMode.SelectedItem = emailActionInstance.DeleteMode.ToString();

相关的 XAML:

<ComboBox x:Name="cmboDelMode" HorizontalAlignment="Left" Margin="149,218,0,0" VerticalAlignment="Top" Width="120">
    <ComboBoxItem Content="HardDelete" HorizontalAlignment="Left" Width="118"/>
    <ComboBoxItem Content="SoftDelete" HorizontalAlignment="Left" Width="118"/>
    <ComboBoxItem Content="MoveToDeletedItems" HorizontalAlignment="Left" Width="118"/>
</ComboBox>

目前组合框默认为空,因此无法按预期工作。我可以使用“emailActionInstance.DeleteMode.ToString();”在文本框中查看数据,所以看来我可能只是错误地设置了所选项目?

【问题讨论】:

    标签: c# wpf enums combobox binding


    【解决方案1】:

    问题是设置 ComboBox.SelectedItem 不起作用,除非 ComboBox 包含您要设置的项目。在您的情况下,您的 ComboBox 填充了三个 ComboBoxItem 对象,它们的 Content 属性设置为字符串。所以 ComboBox.SelectedItem 是一个 ComboBoxItem。您正在尝试将 ComboBox.SelectedItem 设置为一个字符串,该字符串不等于 ComboBox 中包含的任何对象。因此,什么也没有发生。

    我建议像这里一样为您的 ComboBox 设置绑定:

    <ComboBox ItemsSource="{Binding DeleteModes}" SelectedItem="{Binding SelectedDeleteMode}"  />
    

    然后创建一个要绑定的 ViewModel。如果将 Enum 绑定到 ComboBox,它将正确显示,因此您无需调用 DeleteMode.ToString():

    public class ViewModel : INotifyPropertyChanged
    {
        public ViewModel()
        {
            DeleteModes = new ObservableCollection<DeleteMode>
            { DeleteMode.HardDelete, DeleteMode.SoftDelete,
              DeleteMode.MoveToDeletedItems };
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        DeleteMode _selected_delete_mode;
        public DeleteMode SelectedDeleteMode {
            get { return _selected_delete_mode; }
            set {
                _selected_delete_mode = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedDeleteMode"));
            }
        }
    
        ObservableCollection<DeleteMode> _delete_modes;
        public ObservableCollection<DeleteMode> DeleteModes {
            get { return _delete_modes; }
            set {
                _delete_modes = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("DeleteModes"));
            }
        }
    
        public void update_mode(DeleteMode mode) => SelectedDeleteMode = mode;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2010-09-08
      相关资源
      最近更新 更多