Подтвердить что ты не робот

Как связать тип данных DataTemplate с интерфейсом?

Я пишу составное слабосвязанное приложение MVVM WPF, а дочерние виртуальные машины в родительской виртуальной машине - это интерфейсы, а не экземпляры классов, например.

public IChildViewModel { get; set; }

Теперь, как мне сделать это свойство с помощью DataTemplate? как:

<DataTemplate DataType="{x:Type contracts:IChildViewModel}">

Я понимаю из-за характера интерфейсов (множественное наследование и т.д.) WPF не разрешает эту прямую привязку. Но так как интерфейсы должны широко использоваться в слабосвязанных приложениях, существует ли какое-либо обходное решение для привязки DataTemplate к интерфейсам? Спасибо.

4b9b3361

Ответ 1

Вы можете привязываться к интерфейсам, явно указывая wpf, что вы привязываетесь к полю интерфейса:

(Обратите внимание, что ViewModelBase - это просто базовый класс, который реализует интерфейс INotifyPropertyChanged)

public class Implementation : ViewModelBase, IInterface
{
    private string textField;

    public string TextField
    {
        get
        {
            return textField;
        }
        set
        {
            if (value == textField) return;
            textField = value;
            OnPropertyChanged();
        }
    }
}

public interface IInterface
{
    string TextField { get; set; }
}

Затем на ViewModel:

private IInterface interfaceContent;
public IInterface InterfaceContent
{
    get { return interfaceContent; }
}

И, наконец, Xaml позволяет:

<ContentControl Grid.Row="1" Grid.Column="0" Content="{Binding InterfaceContent}">
    <ContentControl.ContentTemplate>
        <DataTemplate DataType="{x:Type viewModels:IInterface}">
            <TextBox Text="{Binding Path=(viewModels:IInterface.TextField)}"/>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

Как вы можете видеть, привязка явно ссылается на определение "IInterface".

Ответ 2

Вы можете преобразовать свой интерфейс в эквивалентный абстрактный класс. Это работает таким образом.