При использовании ReactiveUI wpf не удалось связать список значений Enum из viewmodel в выпадающий список - PullRequest
0 голосов
/ 26 июня 2019

Допустим, у меня есть это перечисление

 public enum LogType
     {
         None = 0,
         File = 1,
         Folder = 2
     }

Я имею в виду этот ComboBox

    <ComboBox Name="CustomLogLogType"  FontSize="10"
              MinHeight="20" Height="20" SelectedItem="{Binding LogType}">

Тогда ViewModel, как это так

public class CustomLogRuleItemViewModel : ReactiveObject
{

    [Reactive]
    public LogType LogType { get; set; } = LogType.File;

    public List<LogType> LogTypes => Enum.GetValues(typeof(LogType)).Cast<LogType>().Where(_ => _ != LogType.None).ToList();
}

Затем в коде для представления

public partial class CustomLogRuleItemView : ReactiveUserControl<CustomLogRuleItemViewModel> 
{
    public CustomLogRuleItemView()
    {
        InitializeComponent();

        this.ViewModel = new CustomLogRuleItemViewModel();
        this.DataContext = this.ViewModel;

        //The below works
        //CustomLogLogType.ItemsSource = this.ViewModel.LogTypes;


        this.WhenActivated(
            disposables =>
            {

                //If I use below it will error with exception
                this.OneWayBind(this.ViewModel,
                        _ => _.LogTypes, _ => _.CustomLogLogType.ItemsSource)
                    .DisposeWith(disposables);
            });
    }
}

В основном, если я связываюсь с ниже, это работает

CustomLogLogType.ItemsSource = this.ViewModel.LogTypes;

Но если я попытаюсь использовать ReactiveUI для привязки, как показано ниже

            this.OneWayBind(this.ViewModel,
                    _ => _.LogTypes, _ => _.CustomLogLogType.ItemsSource)
                .DisposeWith(disposables);

Я получаю исключение, утверждающее, что LogType для ReactiveUI.IViewFor нарушает ограничение типа 'T'. Неуверенный, почему я бы получить что-то споря о IViewFor как раз имеет отношение к реализации ViewModel для зрения.

1 Ответ

1 голос
/ 27 июня 2019

Проблема заключается в том, что ReactiveUI по умолчанию установит ItemTemplate, разрешив IViewFor<TypeInItemsSource>, что облегчает разделение ваших представлений.Таким образом, автоматический просмотр просмотра отключается, если вы добавляете ItemTemplate, DisplayMemberPath или ItemTemplateSelector в этих сценариях.См. этот код для строки кода, которая делает это.

<ComboBox Name="CustomLogLogType"  FontSize="10"
                  MinHeight="20" Height="20">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>

Я смог обойти это, добавив свой собственный ItemTemplate.

Я думаю, что этохотя в действительности это ошибка, так что если вы не против открыть ошибку в https://github.com/reactiveui/ReactiveUI/issues, я исправлю ее в ближайшие пару дней.Я не думаю, что для примитивных типов мы должны добавлять ItemTemplate, так как реально я не вижу пользователей, которые действительно хотят эту функцию для примитивных типов.

...