WPF видит привязку времени проектирования в UserlControl без MVVM - PullRequest
1 голос
/ 14 апреля 2020

Я проектирую новый UserControl для своего проекта, и он не использует MVVM, потому что я хочу связать его свойства непосредственно с родительским XAML. Итак, у меня есть куча свойств зависимостей, и мои привязки выглядят так: Text="{Binding Title, ElementName=ThisControl}". Все они работают во время выполнения, но я действительно не могу заставить его работать во время разработки.

Я видел много решений здесь, в SO, но все они предназначены для тех случаев, когда у вас есть привязки к свойство ViewModel. '

Я попытался установить их начальное значение для самих свойств и конструктора, но они не отображаются во время разработки. Есть ли способ сделать это?

- ОБНОВЛЕНИЕ -

Вот пример UserControl

- XAML

<UserControl x:Class="QualityChecker.Client.UserInterface.Pages.QuickAudit.Controls.InfoCard"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             TextElement.Foreground="{DynamicResource MaterialDesignBody}"
             TextElement.FontWeight="Regular"
             TextElement.FontSize="13"
             TextOptions.TextFormattingMode="Ideal" 
             TextOptions.TextRenderingMode="Auto"   
             Background="{DynamicResource MaterialDesignPaper}"
             FontFamily="{DynamicResource MaterialDesignFont}"
             mc:Ignorable="d" 
             Name="ThisControl"
             d:DesignHeight="450" d:DesignWidth="800">
    <materialDesign:Card Width="350" Margin="8 2 4 16" Height="180">
        <Grid VerticalAlignment="Stretch">
            ...
            <TextBlock Style="{StaticResource MaterialDesignHeadline5TextBlock}" Margin="16 16 16 8" Text="{Binding Title, ElementName=ThisControl}"></TextBlock>
             ...
         </Grid>
    </materialDesign:Card>
</UserControl>

- .cs

public CustomUserControl()
{
    Title = "My Initial value"
}

public string Title
{
    get => (string)GetValue(TitleProperty);
    set => SetValue(TitleProperty, value);
}
public static readonly DependencyProperty TitleProperty =
    DependencyProperty.Register(nameof(Title), typeof(string),
    typeof(InfoCard), new FrameworkPropertyMetadata("Initial Value"));

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Могут помочь следующие два примера, которые я предлагал в прошлом.

Один образец пользовательского элемента управления, 3 свойства зависимости

Другой для настроенного пользователя кнопка

Чтобы визуально получить то, что вы ищете, ВРЕМЯ ПРОЕКТИРОВАНИЯ выполняется с помощью шаблонов элементов управления и создания TemplateBinding для рассматриваемых деталей.

Я думаю, что первым примером будет лучшее соответствие через свойства зависимостей, и в этом я предлагаю 3 различных макета шаблонов элементов управления, так что вы можете выбрать тот, который вам больше подходит.

Второе показывает начало до конца для настраиваемой кнопки.

Предположение заключается в том, что ваш пользовательский элемент управления получен из заданного известного элемента управления, даже если он получен из "Пользовательского элемента управления" и у вас есть все ваши дополнительные свойства. Затем вы определяете шаблон элемента управления НА ОСНОВЕ ВАШЕГО пользовательского типа элемента управления, а не универсальный c «UserControl». Основанный на позволяет XAML правильно определять доступные пользовательские свойства, которые вы хотите предоставить в окончательном выводе элемента управления. Затем, устанавливая стиль для вашего элемента управления на основе шаблона элемента управления, каждый раз, когда вы помещаете его в форму, он будет отображать значения, установленные во время разработки.

Если вы определите

<UserControl .. properties you expect... >

, но не с помощью

   <xmlRefNamespaceToYourClass:YourCustomClass … properties will now be visible … >

вы не увидите ожидаемые свойства для показа.

Каждый из соответствующих примеров работает и довольно хорошо прокомментирован как / где go и почему.

1 голос
/ 15 апреля 2020

Я не думаю, что это сработает так, как вы хотите. Проблема в том, что конструктор никогда не создает экземпляр класса, который вы редактируете, только его дочерние классы (и даже тогда, только те, которые уже были успешно скомпилированы). Он также не создает экземпляр кода stati c, поэтому DP также никогда не создаются. Причина, по которой связывание данных работает, заключается в том, что вы опять не привязываете что-либо к самому классу, а привязываете его дочерние элементы управления к данным проектирования.

Существуют обходные пути, такие как явное создание экземпляра класса и установив его в качестве собственного контекста данных времени разработки с d:DataContext, но они действительно беспорядочные и будут портиться с привязками данных выше логического дерева. Лучше всего сделать копию своего элемента управления в родительском окне во время разработки и визуализировать его таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...