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

तो मैंने ऐसा कुछ किया>

<MenuItem StaysOpenOnClick="True" 
          Header="Reiniciar áudio"
          IsCheckable="True"
          Name="RestartAudioCheck" 
          IsChecked="{Binding PlayType, 
          Mode=TwoWay,
          Converter={StaticResource PlayTypeCheckedConverter},
          ConverterParameter=restart}">
</MenuItem>
<MenuItem StaysOpenOnClick="True" 
          Header="Parar áudio"
          IsCheckable="True"
          Name="StopAudioCheck"
          IsChecked="{Binding PlayType, 
            Mode=TwoWay,
          Converter={StaticResource PlayTypeCheckedConverter},
          ConverterParameter=stop}">
</MenuItem>
<MenuItem StaysOpenOnClick="True" 
          Header="Pausar áudio"
          IsCheckable="True"
          Name="PauseAudioCheck"
          IsChecked="{Binding PlayType, 
            Mode=TwoWay,
          Converter={StaticResource PlayTypeCheckedConverter},
          ConverterParameter=pause}">
</MenuItem>

और कनवर्टर:

class PlayTypeCheckedConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is PlayType type))
            return false;

        if (!(parameter is string check))
            return false;

        if (check.CompareTo("restart") == 0 && type == PlayType.Restart)
            return true;
        if (check.CompareTo("stop") == 0 && type == PlayType.Stop)
            return true;
        if (check.CompareTo("pause") == 0 && type == PlayType.Pause)
            return true;

        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is bool isChecked))
            return true;

        if (!(parameter is string type))
            return PlayType.Restart;

        if (type.CompareTo("restart") == 0 && isChecked)
            return PlayType.Restart;
        if (type.CompareTo("stop") == 0 && isChecked)
            return PlayType.Stop;
        if (type.CompareTo("pause") == 0 && isChecked)
            return PlayType.Pause;

        return PlayType.Restart;
    }
}

मेरा प्रश्न है: कनवर्टर पर कुछ जानने के उदाहरण के रूप में एक कनवर्टर पैरामीटर को एक पूर्ण पाठ की तरह पास करना गलत है? जैसे मैंने बहुत अच्छा काम किया।

1
Kevin Kouketsu 24 सितंबर 2018, 20:57

2 जवाब

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

स्ट्रिंग अक्षर की स्पष्ट रूप से तुलना करने के लिए, जैसा आपने किया था, सामान्य रूप से एक बुरा अभ्यास माना जाता है। डब्ल्यूपीएफ या नहीं, स्पष्ट कारणों से कि यह रनटाइम त्रुटियों से ग्रस्त है और कोई प्रकार की जांच मौजूद नहीं है।

ऐसे दो समाधान हैं जिनके बारे में मैं सोच सकता था:

  1. सबसे आम तरीका यह होगा कि व्यू मॉडल में तीन प्रॉपर्टीज को सिर्फ गेटर्स के साथ जोड़ा जाए जो मूल रूप से सही या गलत लौटाते हैं, अगर राज्य संतुष्ट है। Play State में परिवर्तन होने पर आप इन तीनों बूलियन गुणों के लिए परिवर्तित संपत्ति बढ़ा सकते हैं।

व्यू मॉडल के इस उदाहरण से, आप प्रत्येक चेकबॉक्स को उनके संबंधित गुणों (IsPlaying,IsStopped,IsPaused) को देखने के लिए बाध्य कर सकते हैं:

    private State _playState;
    public State PlayState
    {
        get { return _playState; }
        set {

            SetProperty(ref _playState, value);
            RaisePropertyChanged(nameof(IsPlaying));
            RaisePropertyChanged(nameof(IsPaused));
            RaisePropertyChanged(nameof(IsStopped));
        }
    }

    public bool IsPlaying
    {
        get { return _playState == State.Playing; }
    }
    public bool IsPaused
    {
        get { return _playState == State.Paused; }
    }
    public bool IsStopped
    {
        get { return _playState == State.Stopped; }
    }
  1. अपनी PlayState प्रॉपर्टी पर चेकबॉक्स के लिए अपने XAML में DataTrigger का उपयोग करें। फिर आप स्ट्रिंग अक्षर के बजाय टाइप किए गए गणना मानों की जांच कर सकते हैं।
2
LadderLogic 25 सितंबर 2018, 19:10

किसी भी प्रकार की संपत्ति के लिए एकल समानता कनवर्टर होना संभव है। इसका उपयोग करने की चाल स्ट्रिंग प्रतिनिधित्व के बजाय विशिष्ट प्रकार के पैरामीटर पास करना है।

कनवर्टर:

public class EqualityCheckConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return Equals(value, parameter);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (Equals(value, true))
            return parameter;

        return Binding.DoNothing;
    }
}

enum के साथ उदाहरण:

// property to bind
public DayOfWeek Day { get; set; }

बंधन:

<Window.Resources>
    <wpfDemos:EqualityCheckConverter x:Key="EqualCheckedConverter"/>
</Window.Resources>

<Menu>
    <MenuItem StaysOpenOnClick="True" 
              Header="Tuesday"
              IsCheckable="True"
              IsChecked="{Binding Day, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={x:Static system:DayOfWeek.Tuesday}}"/>

    <MenuItem StaysOpenOnClick="True" 
              Header="Wednesday"
              IsCheckable="True"
              IsChecked="{Binding Day, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={x:Static system:DayOfWeek.Wednesday}}"/>

    <MenuItem StaysOpenOnClick="True" 
              Header="Thursday"
              IsCheckable="True"
              IsChecked="{Binding Day, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={x:Static system:DayOfWeek.Thursday}}"/>
</Menu>

int के साथ उदाहरण

public int TestNum { get; set; }
<Window.Resources>
    <wpfDemos:EqualityCheckConverter x:Key="EqualCheckedConverter"/>
    <system:Int32 x:Key="Zero">0</system:Int32>
    <system:Int32 x:Key="Ten">10</system:Int32>
</Window.Resources>
<Menu>
    <MenuItem StaysOpenOnClick="True" 
              Header="0"
              IsCheckable="True"
              IsChecked="{Binding TestNum, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={StaticResource Zero}}"/>

    <MenuItem StaysOpenOnClick="True" 
              Header="10"
              IsCheckable="True"
              IsChecked="{Binding TestNum, 
              Mode=TwoWay,
              Converter={StaticResource EqualCheckedConverter},
              ConverterParameter={StaticResource Ten}}"/>
</Menu>
3
ASh 25 सितंबर 2018, 22:21