मेरे पास खिड़कियां हैं जहां मेरे पास कुछ नियंत्रण हैं (समय अवधि पिकर):

अपडेट किया गया

<ComboBox DisplayMemberPath="{Binding Path=Name}" ItemsSource="{Binding Periods}" Name="timeType" />
<Slider Value="20" Minimum="{Binding SelectedItem.Min, ElementName=timeType}" Maximum="{Binding SelectedItem.Max, ElementName=timeType}" Name="timeSlider" />
<Label Content="{Binding ElementName=timeSlider, Path=Value}" Name="timeValue" />
<Label Content="{Binding ElementName=timeSlider, Path=Minimum}" Name="timeValueMin" />
<Label Content="{Binding ElementName=timeSlider, Path=Maximum}" Name="timeValueMax" />

खिड़की वर्ग में मैंने संपत्ति की:

    public class TimePeriodType {
        public string Name { set; get; }
        public int Min { set; get; }
        public int Max { set; get; }
    }

    public List<TimePeriodType> Periods = new List<TimePeriodType>() { 
        new TimePeriodType() { Name="Hours", Max=6, Min=1 }, 
        new TimePeriodType(){ Name="Minutes", Max=59, Min=20 }
    };

और अब जब मैं ग्रुपबॉक्स में मूल्य बदलता हूं तो मैं स्लाइडर मानों को अपडेट करने के लिए कुछ सोचना चाहता हूं। क्या इसे करने की कोई संभावना है?

मैं पहले से ही इसे इस तरह करता हूं:

    private void timeType_SelectionChanged( object sender, SelectionChangedEventArgs e ) {
        var period = Periods.Single(p => p.Name == timeType.SelectedValue.ToString());
        timeSlider.Minimum = period.Min;
        timeSlider.Maximum = period.Max;
    }

लेकिन मेरे लिए यह बहुत अच्छा समाधान नहीं है। शायद आप इसे करने का आसान तरीका जानते हैं?

1
nosbor 20 सितंबर 2011, 00:40

2 जवाब

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

ठीक है मुझे समाधान मिला। प्राप्त विधि के साथ संपत्ति होनी चाहिए:

    public class TimePeriodType {
        public string Name { set; get; }
        public int Min { set; get; }
        public int Max { set; get; }
    }

    List<TimePeriodType> _periods = new List<TimePeriodType>() { 
        new TimePeriodType() { Name="Hours", Max=6, Min=1 }, 
        new TimePeriodType() { Name="Minutes", Max=59, Min=20 }
    };

    public List<TimePeriodType> Periods {
        get { return _periods; }
        set { _periods = value; }
    }

और इसके अलावा निम्नलिखित बाध्यकारी होना चाहिए:

ItemsSource="{Binding Periods, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
0
nosbor 20 सितंबर 2011, 14:43

समाधान को थोड़ा साफ-सुथरा दिखाने के लिए मैंने आपकी डिज़ाइन विशेषताओं को हटा दिया है।

अपने कोड में TimePeriodType की अपनी सूची को उजागर रखें:

public List<TimePeriodType> Periods = new List<TimePeriodType>() {
    new TimePeriodType() { Name="Hours",   Max=6,  Min=1  },
    new TimePeriodType() { Name="Minutes", Max=59, Min=20 }
};

सुनिश्चित करें कि आपका DataContext आपके द्वारा उपयोग किए जा रहे बैकिंग क्लास के सदस्यों से जुड़ने की अनुमति देने के लिए उचित रूप से सेट है।

फिर, उस सूची में ListBox (या अन्य Selector नियंत्रण) को बांधें:

<ListBox ItemsSource="{Binding Periods}"
         Name="timeType" />

अब, आप सीधे Slider के गुणों को ListBox के SelectedItem के गुणों से जोड़ सकते हैं (जो वास्तव में एक TimePeriodType है क्योंकि पूर्व बाध्यकारी है):

<Slider Maximum="{Binding SelectedItem.Max, ElementName=timeType}"
        Minimum="{Binding SelectedItem.Min, ElementName=timeType}"
        Name="timeSlider" />

अंत में, आप लेबल को Slider को निर्दिष्ट मानों से बाँध सकते हैं:

<Label Content="{Binding Value, ElementName=timeSlider}"
       Name="timeValue" />
<Label Content="{Binding Minimum, ElementName=timeSlider}"
       Name="timeValueMin" />
<Label Content="{Binding Maximum, ElementName=timeSlider}"
       Name="timeValueMax" />
1
Adam Maras 20 सितंबर 2011, 00:52
ठीक। लेकिन कम्बोबॉक्स में 2 नामों के बजाय 6 रिक्त रिकॉर्ड हैं। केवल नाम देखने के लिए मुझे क्या करना चाहिए?
 – 
nosbor
20 सितंबर 2011, 01:51
अपने ComboBox में, DisplayMemberPath को "Name" पर सेट करें; जो नियंत्रण को प्रत्येक आइटम पर प्रदर्शन मूल्य के रूप में Name संपत्ति का उपयोग करने का निर्देश देता है। साथ ही, मुझे नहीं पता कि आपके पास सूची में 6 आइटम क्यों हैं, यदि आप केवल 2 ऑब्जेक्ट्स की सूची में बाध्यकारी हैं ... आपको इसे और डीबग करना होगा।
 – 
Adam Maras
20 सितंबर 2011, 02:39
ठीक है। मैं अपनी पोस्ट में अपना एक्सएएमएल कोड सही करता हूं। आप इसे देख सकते हैं। शायद मैंने कुछ गलत किया। मैंने अपने सी # कोड में कुछ भी नहीं बदला, ईवेंट चयन के लिए हटाने की विधि को छोड़कर। मैंने डेटाकॉन्टेक्स्ट और आइटमसोर्स द्वारा बाध्यकारी करने की कोशिश की लेकिन यह वही प्रभाव है। वास्तव में मुझे नहीं पता कि सूची में 6 तत्व हैं या नहीं। मैं किसी को नहीं चुन सकता। लेकिन सूची 6 खाली तत्वों की तरह दिखती है (मेरा मतलब केवल सूची की ऊंचाई - खाली सफेद आयत)। मैंने डिस्प्लेमेम्बरपाथ = "नाम" सेट करने का भी प्रयास किया लेकिन मेरा वही प्रभाव पड़ा।
 – 
nosbor
20 सितंबर 2011, 10:59
केवल एक चीज जो मुझे तुरंत गलत लगती है वह यह है कि DisplayMemberPath="{Binding Path=Name}" DisplayMemberPath="Name" होना चाहिए (यह सिर्फ एक टेक्स्ट फ़ील्ड है, कुछ ऐसा नहीं है जिसे बाध्य करने की आवश्यकता है) इसलिए अगला कदम एक ItemsControl जोड़ना होगा। जिसका ItemsSource वही है जो आपके ComboBox का है। <ItemsControl ItemsSource="{Binding Periods}" />' This should show you exactly what the ComboBox` के लिए बाध्य किया जा रहा है।
 – 
Adam Maras
20 सितंबर 2011, 12:25
ठीक है, मैंने अभी आपकी पिछली टिप्पणी दोबारा पढ़ी; मुझे लगता है कि जो गलत है वह यह है कि ComboBox का प्रारंभिक बंधन नहीं ले रहा है क्योंकि Window (या अन्य मूल तत्व) का DataContext सही नहीं है। अपने Window (या UserControl, आदि..) के शुरुआती टैग में निम्नलिखित विशेषता जोड़ें: DataContext="{Binding RelativeSource={RelativeSource Self}}"
 – 
Adam Maras
20 सितंबर 2011, 12:41