繁体   English   中英

WPF C# - 将枚举绑定到 ComboBox

[英]WPF C# - Binding Enum to ComboBox

我有一个 combobox 具有以下选项:“HardDelete”、“SoftDelete”、“MoveToDeletedItems”

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

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>

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

问题是设置 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM