मैं डब्ल्यूपीएफ में काफी विशिष्ट चीज हासिल करने की कोशिश कर रहा हूं। मुझे एक सत्यापन योग्य नियंत्रण बनाने की आवश्यकता है, जो इस तरह के सामान्य वर्ग की वस्तु के लिए बाध्य होगा

public interface IVerifiable
{
    bool Verified { get; set; }
}

public class VerifiableProperty<T> : INotifyPropertyChanged, IVerifiable
{
    private T _value;
    private bool _verified;

    public T Value
    {
        get => _value;
        set
        {
            if (Equals(value, _value)) return;
            _value = value;
            OnPropertyChanged();
        }
    }

    public bool Verified
    {
        get => _verified;
        set
        {
            if (value == _verified) return;
            _verified = value;
            OnPropertyChanged();
        }
    }
}

मैं इस तरह से नियंत्रण बांधता हूं

<TextBox Text="{Binding Path=Number.Value}" att:VerifiableControl.Verified="{Binding Path=Number.Verified}"
                                                 BorderBrush="{Binding Path=(att:VerifiableControl.Verified), Mode=OneWay,
                                                               Converter={StaticResource BackColorVerifiedConverter}}">
                                            <inter:Interaction.Triggers>
                                                <inter:EventTrigger EventName="LostFocus">
                                                    <inter:InvokeCommandAction Command="{Binding Path=DataContext.VerifyCurrentFieldCommand, ElementName=Root}"
                                                                               CommandParameter="{Binding Path=Number}"/>
                                                </inter:EventTrigger>
                                            </inter:Interaction.Triggers>
                                        </TextBox>

सत्यापन योग्य संपत्ति वस्तु का सामान्य मूल्य टेक्स्ट (या डेटपिकर, आदि के मामले में चयनित दिनांक) से जुड़ता है, सीमा रंग कनवर्टर के माध्यम से "सत्यापित" ध्वज के लिए बाध्य होता है और मैं "फोकसलोस्ट" ईवेंट के लिए व्यूमोडेल कमांड के लिए इंटरैक्शन ट्रिगर को बांधता हूं जो अभी "सत्यापित" सेट करता है "संबंधित संपत्ति वस्तु का ध्वज सत्य है।

मुझे वास्तव में यह विचार पसंद नहीं है कि मुझे इस ब्लॉक को कई बार छोटे बदलावों के साथ कॉपी करना है। मुझे पता है, मैं इंटरकेशन ट्रिगर को स्टाइल में नहीं रख सकता और मुझे उसके लिए किसी तरह का शॉर्ट पैटर्न बनाने का दूसरा तरीका भी नहीं मिला। तो, क्या इस xaml कोड के लिए किसी प्रकार का छोटा पैटर्न बनाने का कोई तरीका है जहां मैं संपत्ति के नाम को बांधने के लिए अनुकूलित कर सकता हूं? या हो सकता है कि आप जो हासिल करना चाहते हैं उसके लिए आप एक और दृष्टिकोण सुझा सकते हैं?

0
Andrey1661 12 नवम्बर 2018, 06:24

1 उत्तर

सबसे बढ़िया उत्तर

कुछ संलग्न गुणों का उपयोग करें और वहां लॉस्टफोकस ईवेंट में संलग्न करें।

public static class VerifiableBehaviour
{
    public static bool GetVerified(UIElement obj) => (bool)obj.GetValue(VerifiedProperty);
    public static void SetVerified(DependencyObject obj, bool value) => obj.SetValue(VerifiedProperty, value);

    public static readonly DependencyProperty VerifiedProperty = DependencyProperty.RegisterAttached(
        "Verified", typeof(bool), typeof(VerifiableBehaviour),
        new FrameworkPropertyMetadata(false)
        {
            BindsTwoWayByDefault = true,
            DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
        });

    public static bool GetTracking(UIElement obj) => (bool)obj.GetValue(TrackingProperty);
    public static void SetTracking(UIElement obj, bool value) => obj.SetValue(TrackingProperty, value);

    public static readonly DependencyProperty TrackingProperty = DependencyProperty.RegisterAttached(
        "Tracking", typeof(bool), typeof(VerifiableBehaviour),
        new PropertyMetadata(false, Tracking_PropertyChanged));

    private static void Tracking_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        UIElement element = d as UIElement;

        if ((bool)e.NewValue)
            element.LostFocus += Element_LostFocus;
        else
            element.LostFocus -= Element_LostFocus;
    }

    private static void Element_LostFocus(object sender, RoutedEventArgs e)
    {
        UIElement element = sender as UIElement;
        SetVerified(element, true);
    }
}

और इसे अपने नियंत्रण में बांधें

<StackPanel>
    <StackPanel.Resources>
        <DataTemplate x:Key="VerifiableText">
            <StackPanel>
                <TextBox b:VerifiableBehaviour.Tracking="True" 
                         b:VerifiableBehaviour.Verified="{Binding Verified}" 
                         Text="{Binding Value}"/>
                <TextBlock>(Verified: <Run Text="{Binding Verified}"/>)</TextBlock>
            </StackPanel>
        </DataTemplate>
    </StackPanel.Resources>

    <TextBlock Text="MyProperty1"/>
    <ContentControl ContentTemplate="{StaticResource VerifiableText}" 
                    Content="{Binding MyProperty1}" IsTabStop="False"/>
    <Separator/>
    <TextBlock Text="MyProperty2"/>
    <ContentControl ContentTemplate="{StaticResource VerifiableText}" 
                    Content="{Binding MyProperty2}" IsTabStop="False"/>
    <Separator/>
    <TextBlock Text="MyProperty3"/>
    <ContentControl ContentTemplate="{StaticResource VerifiableText}" 
                    Content="{Binding MyProperty3}" IsTabStop="False"/>
    <Separator/>
    <TextBlock Text="MyProperty4"/>
    <ContentControl ContentTemplate="{StaticResource VerifiableText}" 
                    Content="{Binding MyProperty4}" IsTabStop="False"/>
    <Separator/>
</StackPanel>
1
Sir Rufo 12 नवम्बर 2018, 08:04