এক্সএএমএল-এ কেবলমাত্র পঠনযোগ্য সম্পত্তি থেকে ওয়ানওয়েটোসোর্স বাঁধাই


88

আমি কোনও Readonlyসম্পত্তি OneWayToSourceহিসাবে মোড হিসাবে আবদ্ধ করার চেষ্টা করছি , তবে মনে হচ্ছে এটি XAML তে করা যায় না:

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

আমি পাই:

সম্পত্তি 'ফ্ল্যাগথিংই.আইএসএমডিফায়েড' সেট করা যাবে না কারণ এতে অ্যাক্সেসযোগ্য সেট অ্যাক্সেসর নেই।

IsModifiedএকটি শুধু পড়ার জন্য DependencyPropertyউপর FlagThingy। আমি সেই মানটি FlagIsModifiedপাত্রে সম্পত্তিটিতে আবদ্ধ করতে চাই ।

স্পষ্ট করা:

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

এটি কি কেবল এক্সএএমএল ব্যবহার করে সম্ভব?


আপডেট: ঠিক আছে, আমি এই ক্ষেত্রেটি কনটেইনারটিতে নয়, বরং ধারককে নির্ধারণ করে স্থির করেছি FlagThingy। তবে আমি এটি এখনও সম্ভব কিনা তা জানতে চাই।


তবে আপনি কীভাবে কেবলমাত্র পঠিত সম্পত্তির মূল্য নির্ধারণ করতে পারেন?
ইদুরসুন

4
আপনি পারবেন না। এটি আমি অর্জন করার চেষ্টা করছি তাও নয়। আমি পাঠ্য IsModifiedলেখার সম্পত্তি থেকে কেবল পাঠযোগ্য সম্পত্তি পাওয়ার চেষ্টা করছি FlagIsModified
ইনফেরিস

ভাল প্রশ্ন. আপনার কাজটি কেবলমাত্র তখনই কাজ করে যদি ধারকটি নির্ভরতা অবজেক্ট এবং ফ্ল্যাগআইএসমোডিফাইড হ'ল নির্ভরতাপ্রাপ্ত।
জোশ জি

10
দুর্দান্ত প্রশ্ন, তবে আমি গৃহীত উত্তরটি বুঝতে ব্যর্থ। আমি প্রশংসা করব যদি কোনও ডাব্লুপিএফ গুরু আমাকে আরও কিছু আলোকিত করতে পারে - এটি কি কোনও বাগ বা ডিজাইনের প্রতি?
ওসকার

অনুযায়ী @Oskar এই এটি একটি বাগ সংশোধন আছে। দৃষ্টিতে কোন স্থির।
ব্যবহারকারী 1151923

উত্তর:


46

ওয়ানওয়েটোসোর্সের জন্য কিছু গবেষণা ফলাফল ...

বিকল্প 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);

বিকল্প # 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}" />

বিকল্প # 3 (কেবল পঠনযোগ্য নির্ভরযোগ্য সম্পত্তি)

সিস্টেম.আর্গগমেন্টএক্সেপশন: 'ইসমোডিফায়েড' সম্পত্তি ডেটা-আবদ্ধ হতে পারে না।

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

30
সুতরাং এটি আসলে একটি বাগ।
ইনফেরিস

চমৎকার গবেষণা। আপনি যদি এত সুন্দরভাবে এখানে না রাখেন তবে আমি সেই একই, বেদনাদায়ক পথে চলতে পারতাম। @ ইনফারিসের সাথে সম্মত হন।
কেভিনার্পে

4
এটি কি বাগ? ওয়ানওয়ে টোসোর্স বাইন্ডিংকে কেবল পঠনযোগ্য নির্ভরশীলতাপ্রাপ্তির সাথে অনুমতি দেওয়া হবে না কেন?
অ্যালেক্স হোপ ও'কনর

এই না একটি বাগ। এটি নকশা এবং ভাল-ডকুমেন্টেড দ্বারা। এটি নির্ভরশীলতা সম্পত্তি সিস্টেমের সাথে মিলিতভাবে বাঁধাই করা ইঞ্জিন যেভাবে কাজ করে তার কারণেই (বাধ্যতামূলক লক্ষ্যটি অবশ্যইDependencyProperty ডিপি হতে হবে )। একটি পঠনযোগ্য ডিপি কেবলমাত্র সম্পর্কিতটি ব্যবহার করে সংশোধন করতে পারে DependencyPropertyKeyBindingExpressionইঞ্জিনটি নিবন্ধিত করতে লক্ষ্য ডিপির মেটা ডেটা ম্যানিপুলেট করতে হয়। যেহেতু DependencyPropertyKeyপাবলিক রাইট সুরক্ষার গ্যারান্টি হিসাবে ব্যক্তিগত হিসাবে বিবেচিত হয়, তাই ইঞ্জিনটিকে কেবল-পঠনযোগ্য ডিপি-র উপর বাইন্ডিং নিবন্ধিত করতে না পারার ফলে এই কীটি উপেক্ষা করতে হবে।
বায়োনিকোড

23

এটি ডাব্লুপিএফের একটি সীমাবদ্ধতা এবং এটি নকশা দ্বারা। এটি এখানে সংযোগে রিপোর্ট করা হয়েছে:
পঠনযোগ্য নির্ভরশীলতা সম্পত্তি থেকে ওয়ানওয়ে টোসোর্স বাইন্ডিং

আমি একটি সমাধান পরিবর্তনশীল উৎস নামে শুধুমাত্র পাঠযোগ্য নির্ভরতা বৈশিষ্ট্য ধাক্কা পাবে তৈরি PushBindingযা আমি এখানে নিয়ে ব্লগ লিখেছিল । উদাহরণস্বরূপ নীচের হিসাবে আছে OneWayToSourceশুধুমাত্র-পঠনযোগ্য ডিপি থেকে বাইন্ডিং ActualWidthএবং ActualHeightএর প্রস্থ ও উচ্চতা বৈশিষ্ট্যDataContext

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

PushBindingদুটি নির্ভরশীল বৈশিষ্ট্য, শ্রোতা এবং মিরর ব্যবহার করে কাজ করে। শ্রোতা OneWayটার্গেটপ্রপারটির সাথে আবদ্ধ এবং PropertyChangedCallbackএতে মিরর সম্পত্তি আপডেট হয় যা OneWayToSourceবাইন্ডিংয়ে নির্দিষ্ট করা হয়েছিল তার সাথে আবদ্ধ ।

ডেমো প্রকল্পটি এখানে ডাউনলোড করা যায়।
এটিতে সোর্স কোড এবং সংক্ষিপ্ত নমুনা ব্যবহার রয়েছে।


মজাদার! আমি একটি অনুরূপ সমাধান নিয়ে এসে এটিকে "কন্ডুইট" বলেছিলাম - কন্ডুইটের আপনার নকশা অনুযায়ী দুটি নির্ভরশীলতা এবং দুটি পৃথক বাইন্ডিং ছিল। আমার যে ব্যবহারের ক্ষেত্রেটি ছিল তা পুরানো বৈশিষ্ট্যগুলিকে এক্সএএমএল-তে সরল পুরানো বৈশিষ্ট্যগুলির সাথে আবদ্ধ করে।
ড্যানিয়েল পাওল

4
আমি দেখতে পাচ্ছি যে আপনার এমএস সংযোগের লিঙ্কটি আর কাজ করে না। এর অর্থ কি এমএস এটি .NET এর নতুন সংস্করণে ঠিক করেছে বা তারা কেবল এটি মুছে ফেলেছে?
ক্ষুদ্র

দুর্ভাগ্যক্রমে, টিনি সংযোগটি শেষ পর্যন্ত পরিত্যক্ত হয়ে গেছে বলে মনে হয়। এটি বহু জায়গায় সংযুক্ত ছিল। আমি মনে করি না যে এটি নির্দিষ্টভাবে কোনও সমস্যা স্থির হয়েছে কিনা সে সম্পর্কে কিছু বোঝায় ,.
ইউইউডিডিআরএলআরএসএস

5

এটি লিখেছেন:

ব্যবহার:

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

কোড:

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

এটি এখনও শৈলী এবং টেমপ্লেটগুলিতে পরীক্ষা করে দেখেনি, অনুমান করুন এটির জন্য বিশেষ কেসিং দরকার।


2

সাইজওয়েবারের উপর ভিত্তি করে এখানে আরও সংযুক্ত সম্পত্তি সমাধান রয়েছে বিস্তারিত এখানে ভিডমোডেলে ফিরে পঠনযোগ্য জিইউআই বৈশিষ্ট্যগুলি পুশ করা হচ্ছে

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

সংযুক্ত সম্পত্তি নিয়ন্ত্রণে ঘোষণা করুন

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

1

বৈধকরণের বাধ্যবাধকতার জন্য এখানে আরও একটি বাস্তবায়ন রয়েছে asহাসেরর

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 ব্যবহার

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

এই বাস্তবায়ন বাঁধাই নির্দিষ্ট Validation.HasError


0

ডাব্লুপিএফ সিএলআর প্রপার্টি সেটার ব্যবহার করবে না, তবে মনে হয় এটি এর ভিত্তিতে কিছু বিজোড় বৈধতা দিয়েছে।

আপনার পরিস্থিতিতে হতে পারে এটি ঠিক হতে পারে:

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

4
সিএলআর সম্পত্তি এই ক্ষেত্রে ব্যবহার করা হয় না।
ইনফেরিস

আপনি কি বোঝাতে চেয়েছেন যে আপনি কেবল নির্ভরশীলতা প্রপার্টি সংজ্ঞায়িত করেছেন এবং <কন্ট্রোলস: ফ্ল্যাগথিংই ইসমোডিফাইড = "..." /> লিখতে সক্ষম হয়েছেন? আমার জন্য এটি বলে: "যদি আমি সিএলআর সম্পত্তি যুক্ত না করি তবে" ইসমোডিফাইটিড "সম্পত্তিটি এক্সএমএল নেমস্পেসে বিদ্যমান নেই"।
alex2k8

4
আমি বিশ্বাস করি ডিজাইনের সময়টি ক্লারির বৈশিষ্ট্যগুলি ব্যবহার করে যেখানে রানটাইম আসলে সরাসরি নির্ভরতা সম্পত্তিতে চলে আসে (যদি এটি এক হয়)।
meandmycode

সিএলআর সম্পত্তি আমার ক্ষেত্রে অপ্রয়োজনীয় (আমি কোড থেকে ইসমোডাইফাইড ব্যবহার করি না) তবে এটি সেখানে রয়েছে (কেবলমাত্র পাবলিক সেটার সহ)। ডিজাইনটাইম এবং রানটাইম উভয়ই কেবল নির্ভরশীলতা নিবন্ধকরণের সাথে সূক্ষ্মভাবে কাজ করে।
ইনফেরিস

বাঁধাই নিজেই সিএলআর সম্পত্তি ব্যবহার করে না, তবে আপনি এক্সএএমএল-এ যখন বাইন্ডিংটি সংজ্ঞায়িত করেন তখন কোডে অনুবাদ করতে হয়। আমি এই পর্যায়ে এক্সএএমএল পার্সারটি অনুমান করি যে ইসমোডাইফাইড সম্পত্তিটি কেবল পঠনযোগ্য, এবং ব্যতিক্রম ছোঁড়া (এমনকি বাঁধাই তৈরি হওয়ার আগেও)।
অ্যালেক্স 2 কে 8

0

হুমম ... আমি নিশ্চিত নই যে আমি এর কোনও সমাধানের সাথে একমত। বাহ্যিক পরিবর্তনকে উপেক্ষা করে আপনার সম্পত্তি রেজিস্ট্রেশনে জোর করে কলব্যাক নির্দিষ্ট করার বিষয়ে কীভাবে? উদাহরণস্বরূপ, ব্যবহারকারীর নিয়ন্ত্রণের মধ্যে মিডিয়ালেট নিয়ন্ত্রণের অবস্থান পেতে আমাকে কেবল পঠন পজিশন নির্ভরতা সম্পত্তি বাস্তবায়ন করতে হবে। আমি এটি কীভাবে করেছি তা এখানে:

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

অন্য কথায়, কেবল পরিবর্তনটিকে উপেক্ষা করুন এবং কোনও পৃথক সদস্যের দ্বারা সমর্থিত মানটি ফেরত দিন যার কোনও সার্বজনীন পরিবর্তনকারী নেই। - উপরের উদাহরণে মিডিয়ােন্ডেন্ডার আসলে ব্যক্তিগত মিডিয়াএলমেন্ট নিয়ন্ত্রণ।


খুব খারাপ এটি ছাত্রলীগের ক্লাসগুলির পূর্বনির্ধারিত বৈশিষ্ট্যের জন্য কাজ করে না: - /
অথবা ম্যাপার

0

এই সীমাবদ্ধতার আশেপাশে আমি যেভাবে কাজ করেছি তা হ'ল ডিপেন্ডেন্সির প্রোপার্টি পুরোপুরি ব্যক্তিগত রেখে আমার ক্লাসে কেবলমাত্র একটি বাঁধাই সম্পত্তি প্রকাশ করা। আমি একটি "প্রপার্টিবাইন্ডিংটোসোর্স" রাইটিং-কেবল সম্পত্তি (এটি কোনও ডিপেন্ডেন্সিপ্রোপার্টি নয়) বাস্তবায়িত করেছি যা এক্সএএমএল-তে একটি বাধ্যবাধক মান হিসাবে সেট করা যেতে পারে। কেবল লেখার জন্য এই সম্পত্তিটির জন্য সেটে আমি বাইন্ডিংএপরেশনগুলিতে কল করি the

ওপি'র নির্দিষ্ট উদাহরণের জন্য এটি দেখতে এরকম হবে:

ফ্ল্যাটটিঙ্গি বাস্তবায়ন:

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;
    }
}

লক্ষ্য করুন যে স্থিতিশীল পাঠযোগ্যভাবে নির্ভরশীলতা প্রপার্টি অবজেক্টটি ব্যক্তিগত। নিয়ন্ত্রণে আমি একটি বোতাম যুক্ত করেছি যার ক্লিক বাটন_ ক্লিক ক্লিক করে। আমার উইন্ডো.এক্সএএমএলে ফ্ল্যাটটিঙ্গি নিয়ন্ত্রণের ব্যবহার:

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

মনে রাখবেন যে বাধ্য করার জন্য আমি এখানে একটি ভিউমোডেলও প্রয়োগ করেছি not আপনি উপরের উত্স থেকে সংগ্রহ করতে পারেন এটি "ফ্ল্যাগআইএসমোডিফাইড" নামে একটি নির্ভরশীলতা প্রকাশ করে।

এটি দুর্দান্ত কাজ করে, সেই তথ্য প্রবাহের দিকটি স্পষ্টভাবে সংজ্ঞায়িত করে আমাকে meিলে .ালাভাবে যুগলভাবে ভিউ থেকে ভিডমোডেলে তথ্য ফিরিয়ে আনতে দেয়।


-1

আপনি এখনই সঠিক পথে বাঁধাই করছেন। ওয়ানওয়েটোসোর্স যখনই আপনার তৈরি করা নিয়ন্ত্রণটিতে ইসমোডাইফাইড পরিবর্তন হয় তখনই ধারকটিতে ফ্ল্যাগআইএসমোডাইফাইড চেষ্টা ও আপডেট করবে। আপনি বিপরীতটি চান, যা কনটেইনার সাথে ইসমোডিফায়েড বাঁধন করা উচিত la ফ্ল্যাগআইডমোডিফায়েড। তার জন্য আপনার বাইন্ডিং মোড ওয়ানওয়ে ব্যবহার করা উচিত

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

শুমার সদস্যদের পূর্ণ তালিকা http://msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx


4
না, আমি ঠিক যে দৃশ্যধারণ করতে চাই তা চাই যা আমি করতে চাই না। ফ্ল্যাগথিংই.আইএসএমডিফায়েড ->
ধারক.ফ্লেজিআইসটি সংশোধিত

4
চিহ্নিত করা হচ্ছে কারণ প্রশ্নকর্তার একটি দ্ব্যর্থক প্রশ্ন ছিল কিছুটা ওভারকিল বলে মনে হচ্ছে।
জেয়ার্ডপাড়

6
@ জারেদপার: আমি প্রশ্নটি সম্পর্কে দ্বিধাদ্বন্ধীয় কি তা দেখছি না। প্রশ্নটিতে বলা হয়েছে যে 1) কেবল পঠনযোগ্য নির্ভরশীল সম্পত্তি রয়েছে IsIsModified, যে 2) ওপি এক্সএএমএল-তে সেই সম্পত্তির উপর বাধ্যবাধকতা ঘোষণা করতে চায় এবং যে 3) বাইন্ডিংটি OneWayToSourceমোডে কাজ করার কথা রয়েছে । আপনার সমাধানটি কার্যত কার্যকর হয় না কারণ, প্রশ্নে বর্ণিত হিসাবে সংকলকটি আপনাকে কেবল পঠনযোগ্য সম্পত্তির উপর বাধ্যবাধকতা ঘোষণা করতে দেয় না, এবং এটি ধারণামূলকভাবে কাজ করে না কারণ IsModifiedকেবল পঠনযোগ্য এবং সুতরাং এর মান হতে পারে না পরিবর্তিত (আবদ্ধ দ্বারা)
বা ম্যাপার 11
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.