मैं अपने viewmodel में चर का एक संग्रह है:WPF मल्टीबाइंडिंग अपेक्षित होने पर स्रोत अपडेट नहीं कर रहा है; सभी को चुनें 'के साथ चेक बॉक्स
public ObservableCollection<ObservableVariable> Variables { get; }= new ObservableCollection<ObservableVariable>();
ObservableVariable वर्ग दो गुण है: स्ट्रिंग नाम और चयनित bool; कक्षा INOTifyPropertyChanged लागू करता है,
मेरा लक्ष्य यह संग्रह एक WPF व्यू में एक चेकलिस्ट से जुड़ा हुआ है, और मल्टीबाइंडिंग का उपयोग करके लागू की गई सूची में 'सभी का चयन करें' चेकबॉक्स रखना है। निम्नलिखित छवि वांछित दृश्य को दर्शाती है।
नीचे XAML का निरीक्षण करें:
<CheckBox Content="Select All" Name="SelectAllCheckbox"></CheckBox>
...
<ListBox ItemsSource="{Binding Variables}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Name}">
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource LogicalOrConverter}" Mode="TwoWay">
<Binding Path="Selected"></Binding>
<Binding ElementName="SelectAllCheckbox" Path="IsChecked"></Binding>
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
LogicalOrConverter bools के किसी भी संख्या लेता है; यदि कोई सच है, तो सच हो जाओ।
जैसा कि आप ऊपर देख सकते हैं प्रत्येक चेकबॉक्स व्यूमोडेल में एक चर के लिए बाध्य है और 'सभी का चयन करें' चेकबॉक्स की स्थिति है। वर्तमान में, सब कुछ वांछित के रूप में काम करता है निम्न के बाद: यदि मैं 'सभी का चयन करें' पर क्लिक करता हूं, तो चेकबॉक्स अपडेट में अपडेट होते हैं, लेकिन परिवर्तन दृश्यमान में वापस प्रसारित नहीं होता है।
ध्यान दें, सही ढंग से मेरी कार्यान्वयन काम में सबसे अधिक बातें। उदाहरण के लिए, यदि मैं एक व्यक्तिगत चेकबॉक्स पर क्लिक करता हूं, तो व्यूमोडेल सही तरीके से अपडेट किया जाता है।
अधिक विस्तार से समस्या:
जब मैं एक व्यक्ति चेकबॉक्स OnPropertyChanged घटना चर जिसका बॉक्स अभी बदली गई थी में निकाल दिया जाता है पर क्लिक करें; कनवर्टर में कनवर्टबैक फ़ंक्शन निकाल दिया गया है; व्यूमोडेल अपडेट किया गया है और सब ठीक है।
हालांकि, जब मैं "सभी का चयन करें" चेकबॉक्स पर क्लिक करता हूं, तो व्यक्तिगत चेकबॉक्स दृश्य में अपडेट होते हैं, लेकिन OnPropertyChanged को किसी भी चर में नहीं कहा जाता है, और कनवर्टर में कनवर्टबैक फ़ंक्शन को नहीं कहा जाता है।
अगर मैं "सभी का चयन करें" अनचेक करता हूं तो भी रिलीज करें, व्यक्तिगत चेक वापस जो कुछ भी पहले थे, उस पर वापस जाएं।
व्यूमोडेल को अपडेट करने का एकमात्र तरीका व्यक्तिगत चेकबॉक्स में क्लिक करना है। हालांकि, दृश्य के प्रयोजनों के लिए बहुआयामी कार्य करता है।
मेरा प्रश्न है:
क्यों viewmodel में स्रोत संग्रह करने के लिए प्रचारित किया चेकबॉक्स में परिवर्तन नहीं कर रहे हैं
कनवर्टर:
public class LogicalOrConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
foreach (object arg in values)
{
if ((arg is bool) && (bool)arg == true)
{
return true;
}
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
object[] values = new object[2] {false, false};
if (value is bool && (bool) value == true)
values[0] = true;
return values;
}
}
ObservableVariable परिभाषा:
public class ObservableVariable : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
private bool _selected;
public bool Selected
{
get { return _selected; }
set
{
_selected = value;
OnPropertyChanged(nameof(Selected));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
एक प्रश्न - यदि मूल्य "चेक सब" के माध्यम से चुने गए थे और फिर "सभी जांचें" के माध्यम से चयन किया गया था, तो एक प्रश्न - चेकबॉक्स होना चाहिए। आपके एमवीएल कनवर्टर के साथ वे कभी भी अचयनित नहीं होंगे, अगर मूल्य वीएम को प्रचारित किया जाएगा। – Rekshino
@Rekshino, देर से प्रतिक्रिया के लिए खेद है। मैंने काम नहीं किया है कि कैसे अचयनित काम करेगा। इसके लिए तर्क जोड़ना आवश्यक हो सकता है, जो मैं करना चाहता हूं उसके आधार पर। मैंने जानबूझकर समस्या के उस हिस्से को छोड़ दिया क्योंकि मैं अचयनित रसद को एक अलग मुद्दा मानता हूं। –
यदि आप व्यूमोडेल को अपडेट करने के लिए मल्टीबाइंडिंग का उपयोग करना चाहते हैं तो आप इसे वर्कअराउंड के माध्यम से प्राप्त कर सकते हैं, लेकिन मुझे संदेह है कि यह प्रैक्सिस में उपयोगी होगा। यदि आपको इसकी ज़रूरत है तो मैं बाद में अपना उत्तर पोस्ट करूंगा। – Rekshino