XAML'deki salt okunur özelliğinden OneWayToSource bağlama


88

Bir Readonlymülke bağlanmaya çalışıyorumOneWayToSourceAs mode , ancak bu XAML'de yapılamaz gibi görünüyor:

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

Alırım:

'FlagThingy.IsModified' özelliği, erişilebilir bir küme erişimcisine sahip olmadığı için ayarlanamaz.

IsModifiedBir salt okunur DependencyPropertyüzerindeFlagThingy . Bu değeri FlagIsModifiedkapsayıcıdaki özelliğe bağlamak istiyorum .

Açık olmak gerekirse:

FlagThingy.IsModified --> container.FlagIsModified
------ READONLY -----     ----- READWRITE --------

Bu yalnızca XAML kullanılarak mümkün mü?


Güncelleme: Pekala, bu durumu, bağlayıcıyı FlagThingy. Ama yine de bunun mümkün olup olmadığını bilmek istiyorum.


Ancak salt okunur bir özelliğe nasıl değer atayabilirsiniz?
idursun

3
Yapamazsın. Ayrıca başarmaya çalıştığım şey de bu değil. IsModifiedOkuma yazma özelliği için salt okunur özellikten almaya çalışıyorum FlagIsModified.
Inferis

İyi soru. Geçici çözümünüz yalnızca kapsayıcı bir DependencyObject ise ve FlagIsModified bir DependencyProperty ise çalışır.
Josh G

10
Güzel soru, ancak kabul edilen cevabı anlayamadım. Bazı WPF gurusu beni biraz daha aydınlatabilirse memnun olurum - Bu bir hata mı yoksa tasarım başına mı?
Oskar

Göre @Oskar bu bir mikroptur. görünürde bir düzeltme yok.
user1151923

Yanıtlar:


46

OneWayToSource için bazı araştırma sonuçları ...

Seçenek 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);

Seçenek 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}" />

Seçenek # 3 (Gerçek salt okunur bağımlılık özelliği)

System.ArgumentException: 'IsModified' özelliği verilere bağlı olamaz.

// 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...

Reflektör cevabı verir:

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");
    }
 ....

30
Yani bu aslında bir hata.
Inferis

Güzel araştırma. Buraya bu kadar güzel yerleştirmeseydin, ben de aynı, acı dolu yolda yürürdüm. @Inferis ile katılıyorum.
kevinarpe

1
Bu bir hata mı? Neden salt okunur bir DependencyProperty ile OneWayToSource bağlamasına izin verilmiyor?
Alex Hope O'Connor

Bu bir hata değil . Tasarım gereği ve iyi belgelenmiştir. Bunun nedeni, bağlama motorunun bağımlılık özellik sistemiyle birlikte çalışma biçimidir (bağlama hedefi bir DP olmalıdırDependencyProperty ). Salt okunur bir DP, yalnızca ilişkili DependencyPropertyKey. Bir BindingExpressionmotoru kaydetmek için , motorun hedef DP'nin meta verilerini işlemesi gerekir. Yana DependencyPropertyKeykamu yazma korumasını garanti etmek özel kabul edildiğini, motor salt okunur DP bağlayıcı kayıt edememe sonucu bu anahtarı görmezden gerekecektir.
BionicCode

23

Bu, WPF'nin bir sınırlamasıdır ve tasarım gereğidir. Connect'te burada bildirilmiştir:
Bir salt okunur bağımlılık özelliğinden OneWayToSource bağlama

Burada blogPushBinding yazdığım kaynağa salt okunur bağımlılık özelliklerini dinamik olarak aktarabilmek için bir çözüm yaptım . Aşağıdaki örnek , salt okunur DP'lerden ve Genişlik ve Yükseklik özelliklerine Bağlamalar yapar .OneWayToSourceActualWidthActualHeightDataContext

<TextBlock Name="myTextBlock">
    <pb:PushBindingManager.PushBindings>
        <pb:PushBinding TargetProperty="ActualHeight" Path="Height"/>
        <pb:PushBinding TargetProperty="ActualWidth" Path="Width"/>
    </pb:PushBindingManager.PushBindings>
</TextBlock>

PushBindingiki Bağımlılık Özelliği, Dinleyici ve Ayna kullanarak çalışır. Dinleyici, OneWayTargetProperty'ye bağlıdır ve içinde, Binding'de belirtilenlere PropertyChangedCallbackbağlı olan Mirror özelliğini günceller OneWayToSource.

Demo Projesi Buradan İndirilebilir.
Kaynak kodu ve kısa örnek kullanım içerir.


İlginç! Benzer bir çözüm buldum ve buna "Conduit" adını verdim - Conduit, tasarımınıza göre iki bağımlılık özelliğine ve iki ayrı bağlama özelliğine sahipti. Sahip olduğum kullanım durumu, düz eski özellikleri XAML'deki düz eski özelliklere bağlıyordu.
Daniel Paull

3
MS Connect bağlantınızın artık çalışmadığını görüyorum. MS'in onu daha yeni .NET sürümünde düzelttiği veya yeni sildikleri anlamına mı geliyor?
Küçük

@Tiny Connect maalesef sonunda terk edilmiş görünüyor. Birçok yerde bağlantılıydı. Bir sorunun çözülüp çözülmediğine dair özel olarak hiçbir şey ifade ettiğini sanmıyorum.
UuDdLrLrSs

5

Bunu yazdı:

Kullanım:

<TextBox Text="{Binding Text}"
         p:OneWayToSource.Bind="{p:Paths From={x:Static Validation.HasErrorProperty},
                                         To=SomeDataContextProperty}" />

Kod:

using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;

public static class OneWayToSource
{
    public static readonly DependencyProperty BindProperty = DependencyProperty.RegisterAttached(
        "Bind",
        typeof(ProxyBinding),
        typeof(OneWayToSource),
        new PropertyMetadata(default(Paths), OnBindChanged));

    public static void SetBind(this UIElement element, ProxyBinding value)
    {
        element.SetValue(BindProperty, value);
    }

    [AttachedPropertyBrowsableForChildren(IncludeDescendants = false)]
    [AttachedPropertyBrowsableForType(typeof(UIElement))]
    public static ProxyBinding GetBind(this UIElement element)
    {
        return (ProxyBinding)element.GetValue(BindProperty);
    }

    private static void OnBindChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((ProxyBinding)e.OldValue)?.Dispose();
    }

    public class ProxyBinding : DependencyObject, IDisposable
    {
        private static readonly DependencyProperty SourceProxyProperty = DependencyProperty.Register(
            "SourceProxy",
            typeof(object),
            typeof(ProxyBinding),
            new PropertyMetadata(default(object), OnSourceProxyChanged));

        private static readonly DependencyProperty TargetProxyProperty = DependencyProperty.Register(
            "TargetProxy",
            typeof(object),
            typeof(ProxyBinding),
            new PropertyMetadata(default(object)));

        public ProxyBinding(DependencyObject source, DependencyProperty sourceProperty, string targetProperty)
        {
            var sourceBinding = new Binding
            {
                Path = new PropertyPath(sourceProperty),
                Source = source,
                Mode = BindingMode.OneWay,
            };

            BindingOperations.SetBinding(this, SourceProxyProperty, sourceBinding);

            var targetBinding = new Binding()
            {
                Path = new PropertyPath($"{nameof(FrameworkElement.DataContext)}.{targetProperty}"),
                Mode = BindingMode.OneWayToSource,
                Source = source
            };

            BindingOperations.SetBinding(this, TargetProxyProperty, targetBinding);
        }

        public void Dispose()
        {
            BindingOperations.ClearAllBindings(this);
        }

        private static void OnSourceProxyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.SetCurrentValue(TargetProxyProperty, e.NewValue);
        }
    }
}

[MarkupExtensionReturnType(typeof(OneWayToSource.ProxyBinding))]
public class Paths : MarkupExtension
{
    public DependencyProperty From { get; set; }

    public string To { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        var provideValueTarget = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
        var targetObject = (UIElement)provideValueTarget.TargetObject;
        return new OneWayToSource.ProxyBinding(targetObject, this.From, this.To);
    }
}

Henüz stil ve şablonlarda test etmedim, sanırım özel kasaya ihtiyacı var.


2

Burada, burada ayrıntıları verilen SizeObserver'a dayalı başka bir ekli özellik çözümü verilmiştir Salt okunur GUI özelliklerini ViewModel'e geri gönderme

public static class MouseObserver
{
    public static readonly DependencyProperty ObserveProperty = DependencyProperty.RegisterAttached(
        "Observe",
        typeof(bool),
        typeof(MouseObserver),
        new FrameworkPropertyMetadata(OnObserveChanged));

    public static readonly DependencyProperty ObservedMouseOverProperty = DependencyProperty.RegisterAttached(
        "ObservedMouseOver",
        typeof(bool),
        typeof(MouseObserver));


    public static bool GetObserve(FrameworkElement frameworkElement)
    {
        return (bool)frameworkElement.GetValue(ObserveProperty);
    }

    public static void SetObserve(FrameworkElement frameworkElement, bool observe)
    {
        frameworkElement.SetValue(ObserveProperty, observe);
    }

    public static bool GetObservedMouseOver(FrameworkElement frameworkElement)
    {
        return (bool)frameworkElement.GetValue(ObservedMouseOverProperty);
    }

    public static void SetObservedMouseOver(FrameworkElement frameworkElement, bool observedMouseOver)
    {
        frameworkElement.SetValue(ObservedMouseOverProperty, observedMouseOver);
    }

    private static void OnObserveChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
    {
        var frameworkElement = (FrameworkElement)dependencyObject;
        if ((bool)e.NewValue)
        {
            frameworkElement.MouseEnter += OnFrameworkElementMouseOverChanged;
            frameworkElement.MouseLeave += OnFrameworkElementMouseOverChanged;
            UpdateObservedMouseOverForFrameworkElement(frameworkElement);
        }
        else
        {
            frameworkElement.MouseEnter -= OnFrameworkElementMouseOverChanged;
            frameworkElement.MouseLeave -= OnFrameworkElementMouseOverChanged;
        }
    }

    private static void OnFrameworkElementMouseOverChanged(object sender, MouseEventArgs e)
    {
        UpdateObservedMouseOverForFrameworkElement((FrameworkElement)sender);
    }

    private static void UpdateObservedMouseOverForFrameworkElement(FrameworkElement frameworkElement)
    {
        frameworkElement.SetCurrentValue(ObservedMouseOverProperty, frameworkElement.IsMouseOver);
    }
}

Ekli mülkü denetimde beyan et

<ListView ItemsSource="{Binding SomeGridItems}"                             
     ut:MouseObserver.Observe="True"
     ut:MouseObserver.ObservedMouseOver="{Binding IsMouseOverGrid, Mode=OneWayToSource}">    

1

İşte Validation'a bağlanmak için başka bir uygulama.

public static class OneWayToSource
{
    public static readonly DependencyProperty BindingsProperty = DependencyProperty.RegisterAttached(
        "Bindings",
        typeof(OneWayToSourceBindings),
        typeof(OneWayToSource),
        new PropertyMetadata(default(OneWayToSourceBindings), OnBinidngsChanged));

    public static void SetBindings(this FrameworkElement element, OneWayToSourceBindings value)
    {
        element.SetValue(BindingsProperty, value);
    }

    [AttachedPropertyBrowsableForChildren(IncludeDescendants = false)]
    [AttachedPropertyBrowsableForType(typeof(FrameworkElement))]
    public static OneWayToSourceBindings GetBindings(this FrameworkElement element)
    {
        return (OneWayToSourceBindings)element.GetValue(BindingsProperty);
    }

    private static void OnBinidngsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((OneWayToSourceBindings)e.OldValue)?.ClearValue(OneWayToSourceBindings.ElementProperty);
        ((OneWayToSourceBindings)e.NewValue)?.SetValue(OneWayToSourceBindings.ElementProperty, d);
    }
}

public class OneWayToSourceBindings : FrameworkElement
{
    private static readonly PropertyPath DataContextPath = new PropertyPath(nameof(DataContext));
    private static readonly PropertyPath HasErrorPath = new PropertyPath($"({typeof(Validation).Name}.{Validation.HasErrorProperty.Name})");
    public static readonly DependencyProperty HasErrorProperty = DependencyProperty.Register(
        nameof(HasError),
        typeof(bool),
        typeof(OneWayToSourceBindings),
        new FrameworkPropertyMetadata(default(bool), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    internal static readonly DependencyProperty ElementProperty = DependencyProperty.Register(
        "Element",
        typeof(UIElement),
        typeof(OneWayToSourceBindings),
        new PropertyMetadata(default(UIElement), OnElementChanged));

    private static readonly DependencyProperty HasErrorProxyProperty = DependencyProperty.RegisterAttached(
        "HasErrorProxy",
        typeof(bool),
        typeof(OneWayToSourceBindings),
        new PropertyMetadata(default(bool), OnHasErrorProxyChanged));

    public bool HasError
    {
        get { return (bool)this.GetValue(HasErrorProperty); }
        set { this.SetValue(HasErrorProperty, value); }
    }

    private static void OnHasErrorProxyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        d.SetCurrentValue(HasErrorProperty, e.NewValue);
    }

    private static void OnElementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        if (e.NewValue == null)
        {
            BindingOperations.ClearBinding(d, DataContextProperty);
            BindingOperations.ClearBinding(d, HasErrorProxyProperty);
        }
        else
        {
            var dataContextBinding = new Binding
                                         {
                                             Path = DataContextPath,
                                             Mode = BindingMode.OneWay,
                                             Source = e.NewValue
                                         };
            BindingOperations.SetBinding(d, DataContextProperty, dataContextBinding);

            var hasErrorBinding = new Binding
                                      {
                                          Path = HasErrorPath,
                                          Mode = BindingMode.OneWay,
                                          Source = e.NewValue
                                      };
            BindingOperations.SetBinding(d, HasErrorProxyProperty, hasErrorBinding);
        }
    }
}

Xaml'de kullanım

<StackPanel>
    <TextBox Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}">
        <local:OneWayToSource.Bindings>
            <local:OneWayToSourceBindings HasError="{Binding HasError}" />
        </local:OneWayToSource.Bindings>
    </TextBox>
    <CheckBox IsChecked="{Binding HasError, Mode=OneWay}" />
</StackPanel>

Bu uygulama bağlayıcıya özeldir Validation.HasError


0

WPF, CLR özellik ayarlayıcısını kullanmayacak, ancak ona göre bazı garip doğrulama yapıyor gibi görünüyor.

Sizin durumunuzda olabilir, bu sorun olabilir:

    public bool IsModified
    {
        get { return (bool)GetValue(IsModifiedProperty); }
        set { throw new Exception("An attempt ot modify Read-Only property"); }
    }

1
Bu durumda CLR özelliği kullanılmaz.
Inferis

DependencyProperty'yi az önce tanımladığınızı ve <controls: FlagThingy IsModified = "..." /> yazabildiğinizi mi söylüyorsunuz? Benim için şunu söylüyor: "'IsModified' özelliği XML ad alanında mevcut değil" CLR özelliğini eklemezsem.
alex2k8

1
Tasarım zamanının clr özelliklerini kullandığına inanıyorum, burada çalışma zamanı aslında doğrudan bağımlılık özelliğine gidiyor (eğer öyleyse).
meandmycode

Benim durumumda CLR özelliği gereksizdir (koddan IsModified'ı kullanmıyorum), ancak yine de var (yalnızca bir genel ayarlayıcıyla). Hem tasarım zamanı hem de çalışma zamanı yalnızca bağımlılık-mülkiyet kaydı ile sorunsuz çalışır.
Inferis

Bağlamanın kendisi CLR özelliğini kullanmıyor, ancak XAML'de bağlamayı tanımladığınızda koda çevrilmesi gerekir. Sanırım bu aşamada XAML ayrıştırıcısı, IsModified özelliğinin salt okunur olduğunu ve istisna attığını (bağlama oluşturulmadan önce bile) görüyor.
alex2k8

0

Hmmm ... Bu çözümlerden herhangi birine katılıyorum emin değilim. Mülk kaydınızda harici değişikliği yok sayan bir zorlama geri araması belirtmeye ne dersiniz? Örneğin, bir MediaElement denetiminin bir kullanıcı denetimi içindeki konumunu elde etmek için salt okunur bir Konum bağımlılığı özelliği uygulamam gerekiyordu. İşte böyle yaptım:

    public static readonly DependencyProperty PositionProperty = DependencyProperty.Register("Position", typeof(double), typeof(MediaViewer),
        new FrameworkPropertyMetadata(0d, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault | FrameworkPropertyMetadataOptions.Journal, OnPositionChanged, OnPositionCoerce));

    private static void OnPositionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var ctrl = d as MediaViewer;
    }

    private static object OnPositionCoerce(DependencyObject d, object value)
    {
        var ctrl = d as MediaViewer;
        var position = ctrl.MediaRenderer.Position.TotalSeconds;

        if (ctrl.MediaRenderer.NaturalDuration.HasTimeSpan == false)
            return 0d;
        else
            return Math.Min(position, ctrl.Duration);
    }

    public double Position
    {
        get { return (double)GetValue(PositionProperty); }
        set { SetValue(PositionProperty, value); }
    }

Başka bir deyişle, değişikliği yok sayın ve genel değiştiriciye sahip olmayan farklı bir üye tarafından desteklenen değeri geri getirin. - Yukarıdaki örnekte, MediaRenderer aslında özel MediaElement kontrolüdür.


Bunun BCL sınıflarının önceden tanımlanmış özellikleri için çalışmaması çok kötü: - /
VEYA Mapper

0

Bu sınırlamayı aşma yöntemim, DependencyProperty'yi tamamen gizli tutarak sınıfımdaki yalnızca bir Binding özelliğini açığa çıkarmaktı. Xaml'de bir bağlama değerine ayarlanabilen bir "PropertyBindingToSource" salt yazılır özelliği (bu bir DependencyProperty değil) uyguladım. Bu salt yazılır özellik için ayarlayıcıda, bağlamayı DependencyProperty'ye bağlamak için BindingOperations.SetBinding'e çağırıyorum.

OP'nin özel örneği şu şekilde görünecektir:

FlatThingy uygulaması:

public partial class FlatThingy : UserControl
{
    public FlatThingy()
    {
        InitializeComponent();
    }

    public Binding IsModifiedBindingToSource
    {
        set
        {
            if (value?.Mode != BindingMode.OneWayToSource)
            {
                throw new InvalidOperationException("IsModifiedBindingToSource must be set to a OneWayToSource binding");
            }

            BindingOperations.SetBinding(this, IsModifiedProperty, value);
        }
    }

    public bool IsModified
    {
        get { return (bool)GetValue(IsModifiedProperty); }
        private set { SetValue(IsModifiedProperty, value); }
    }

    private static readonly DependencyProperty IsModifiedProperty =
        DependencyProperty.Register("IsModified", typeof(bool), typeof(FlatThingy), new PropertyMetadata(false));

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        IsModified = !IsModified;
    }
}

Statik salt okunur DependencyProperty nesnesinin özel olduğuna dikkat edin. Kontrolde, tıklama Button_Click tarafından işlenen bir düğme ekledim. FlatThingy kontrolünün benim window.xaml'de kullanımı:

<Window x:Class="ReadOnlyBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ReadOnlyBinding"
    mc:Ignorable="d"
    DataContext="{x:Static local:ViewModel.Instance}"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <TextBlock Text="{Binding FlagIsModified}" Grid.Row="0" />
    <local:FlatThingy IsModifiedBindingToSource="{Binding FlagIsModified, Mode=OneWayToSource}" Grid.Row="1" />
</Grid>

Ayrıca burada gösterilmeyen bağlama için bir ViewModel uyguladığımı unutmayın. Yukarıdaki kaynaktan edinebileceğiniz gibi, "FlagIsModified" adlı bir DependencyProperty sunar.

Harika çalışıyor, bilgileri View'den ViewModel'e gevşek bir şekilde bağlı bir şekilde geri göndermeme izin veriyor ve bu bilgi akışının yönü açıkça tanımlanıyor.


-1

Şu anda ciltlemeyi yanlış yönde yapıyorsunuz. OneWayToSource, oluşturduğunuz denetimde IsModified her değişiklik yaptığında kapsayıcıda FlagIsModified'ı deneyecek ve güncelleyecektir. IsModified'ın container.FlagIsModified'a bağlanmasını sağlamak için tersini istiyorsunuz. Bunun için OneWay bağlama modunu kullanmalısınız.

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

Numaralandırma üyelerinin tam listesi: http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx


5
Hayır, tarif ettiğiniz ve yapmak istemediğim senaryoyu tam olarak istiyorum. FlagThingy.IsModified -> container.FlagIsModified
Inferis

3
Soru soran kişinin belirsiz bir sorusu olduğu için not almak biraz abartılı görünüyor.
JaredPar

6
@JaredPar: Soruyla ilgili belirsiz olanın ne olduğunu anlamıyorum. Soru, 1) salt okunur bir bağımlılık özelliği olduğunu IsIsModified, 2) OP'nin XAML'de bu özellik için bir bağlama bildirmek istediğini ve 3) bağlamanın OneWayToSourcemodda çalışmasının beklendiğini belirtir . Çözümünüz pratik olarak çalışmıyor çünkü soruda açıklandığı gibi, derleyici salt okunur bir özellik için bir bağlama bildirmenize izin vermiyor ve kavramsal olarak çalışmıyor çünkü IsModifiedsalt okunurdur ve bu nedenle değeri olamaz değiştirildi (bağlayıcıyla).
VEYA Eşleştirici
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.