Привязка OneWayToSource от свойства только для чтения в XAML

Универсальный GetService < T> метод является методом расширения. Это означает, что вам нужно иметь:

using Microsoft.Extensions.DependencyInjection;

, чтобы компилятор мог его найти.

Этот метод предназначен только для дополнительных услуг. Он вернет null, если объект не может быть построен, либо потому, что тип не был зарегистрирован, либо потому, что некоторые его зависимости отсутствуют.

GetRequiredService следует использовать, когда приложение не может работать, если служба не доступна. Если экземпляр не может быть создан, он выдаст исключение InvalidOperationException.

Когда выдается это исключение, полный текст исключения будет огромной помощью в поиске актуальной проблемы. Исключения, сгенерированные в конструкторах, могут появляться в свойстве Exception.InnerException . Последовательность вызовов, в результате которых возникло исключение, появится в свойстве StackTrace . Вызов Exception.ToString () вернет строку, содержащую всю этой информации для текущего исключения и любых внутренних исключений.

77
задан Interrobang 25 March 2015 в 01:13
поделиться

3 ответа

Некоторое исследование заканчивается для OneWayToSource...

Опция № 3 Опция № 2

// Control definition
public partial class FlagThingy : UserControl
{
    public static readonly DependencyProperty IsModifiedProperty = 
            DependencyProperty.Register("IsModified", typeof(bool), typeof(FlagThingy), new PropertyMetadata());

    public bool IsModified
    {
        get { return (bool)GetValue(IsModifiedProperty); }
        set { throw new Exception("An attempt ot modify Read-Only property"); }
    }
}
<controls:FlagThingy IsModified="{Binding Path=FlagIsModified, 
    ElementName=container, Mode=OneWayToSource}" />

Опция № 1.

// Control definition
public partial class FlagThingy : UserControl
{
    public static readonly DependencyProperty IsModifiedProperty = 
            DependencyProperty.Register("IsModified", typeof(bool), typeof(FlagThingy), new PropertyMetadata());
}
<controls:FlagThingy x:Name="_flagThingy" />
// Binding Code
Binding binding = new Binding();
binding.Path = new PropertyPath("FlagIsModified");
binding.ElementName = "container";
binding.Mode = BindingMode.OneWayToSource;
_flagThingy.SetBinding(FlagThingy.IsModifiedProperty, binding);

(Истинное свойство зависимости только для чтения)

Система. ArgumentException: свойство 'IsModified' не может быть с привязкой к данным.

// Control definition
public partial class FlagThingy : UserControl
{
    private static readonly DependencyPropertyKey IsModifiedKey =
        DependencyProperty.RegisterReadOnly("IsModified", typeof(bool), typeof(FlagThingy), new PropertyMetadata());

    public static readonly DependencyProperty IsModifiedProperty = 
        IsModifiedKey.DependencyProperty;
}
<controls:FlagThingy x:Name="_flagThingy" />
// Binding Code
Same binding code...

Отражатель дает ответ:

internal static BindingExpression CreateBindingExpression(DependencyObject d, DependencyProperty dp, Binding binding, BindingExpressionBase parent)
{
    FrameworkPropertyMetadata fwMetaData = dp.GetMetadata(d.DependencyObjectType) as FrameworkPropertyMetadata;
    if (((fwMetaData != null) && !fwMetaData.IsDataBindingAllowed) || dp.ReadOnly)
    {
        throw new ArgumentException(System.Windows.SR.Get(System.Windows.SRID.PropertyNotBindable, new object[] { dp.Name }), "dp");
    }
 ....
43
ответ дан H.B. 24 November 2019 в 11:01
поделиться

WPF не будет использовать метод set свойства CLR, но кажется, что делает некоторую нечетную проверку на основе его.

май быть в Вашей ситуации это может быть в порядке:

    public bool IsModified
    {
        get { return (bool)GetValue(IsModifiedProperty); }
        set { throw new Exception("An attempt ot modify Read-Only property"); }
    }
0
ответ дан alex2k8 24 November 2019 в 11:01
поделиться

Вы делаете привязку в неправильном направлении прямо сейчас. OneWayToSource попытается обновить FlagIsModified на контейнере каждый раз, когда IsModified изменяется на управлении, Вы создаете. Вы хотите противоположное, которое должно сделать, чтобы IsModified связал с контейнером. FlagIsModified. Для этого необходимо использовать обязательный режим OneWay

<controls:FlagThingy IsModified="{Binding FlagIsModified, 
                                          ElementName=container, 
                                          Mode=OneWay}" />

Полный список участников перечисления: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx

-1
ответ дан JaredPar 24 November 2019 в 11:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: