प्रत्येक नियम के लिए एक कनवर्टर लिखना इस मामले में आपके व्यापार तर्क दो स्थानों (कनवर्टर और दृश्य मॉडल में) डालता है। मैं सुझाव देता हूं कि नियंत्रण दृश्यमान (या अन्य व्यवहार) है या नहीं, यह तय करने के लिए IotifyPropertyChanged ईवेंट के साथ अपने ViewModel में प्रत्येक नियंत्रण के लिए एक संपत्ति/ध्वज बनाना है।
ध्यान दें, कि जब आप मेरे व्यूमोडेल (नीचे) देखते हैं तो आप देखेंगे कि मैं प्रकार के बूल और Visibilty के गुणों का पर्दाफाश करता हूं।
यदि आपको सामान्य नियम के रूप में संपत्ति का उपयोग करने की आवश्यकता है तो बूल और डेटा ट्रिगर का उपयोग करें।
public bool ControlD
आप सीधे दृश्यता के लिए बाध्य कर सकते हैं आप केवल दृश्यता को नियंत्रित करने की जरूरत है:
public Visibility ControlA
अद्यतन: @Wallstreet प्रोग्रामर द्वारा टिप्पणी की वजह से , मैं एक BooleanVisibilityConverter उपयोग करने के लिए एक और विकल्प जोड़ा । कनवर्टर का उपयोग करने के तरीके को प्रतिबिंबित करने के लिए मैंने नीचे पांचवां नियंत्रण अपडेट किया। मैंने नीचे कनवर्टर के लिए कोड जोड़ा।
<Window x:Class="ControlVisibleTrigger.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Main Window" Height="400" Width="800">
<Window.Resources>
<Style x:Key="DropDownStyle" TargetType="TextBox">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ControlC}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<DockPanel>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<CheckBox IsChecked="{Binding Path=Alpha,Mode=TwoWay}" Content="Alpha"/>
<CheckBox IsChecked="{Binding Path=Beta,Mode=TwoWay}" Content="Beta"/>
<CheckBox IsChecked="{Binding Path=Gamma,Mode=TwoWay}" Content="Gamma"/>
<CheckBox IsChecked="{Binding Path=Delta,Mode=TwoWay}" Content="Delta"/>
</StackPanel>
<TextBox Grid.Row="1" Visibility="{Binding Path=ControlA}" Text="Binding to visibility"/>
<Button Grid.Row="2" Visibility="{Binding Path=ControlB}" Content="Binding to visibility"/>
<TextBox Grid.Row="3" Style="{StaticResource DropDownStyle}" Text="Using WindowResource DataTrigger"/>
<TextBox Grid.Row="4" Text="Using Local DataTrigger">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ControlD}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<Button Grid.Row="5"
Content="Press me"
Visibility="{Binding Path=ControlE, Converter={StaticResource booleanVisibilityConverter}, ConverterParameter=True, Mode=OneWay}">
</Grid>
</DockPanel>
</Window>
यहाँ ViewModel है:
यहाँ XAML में एक परीक्षण खिड़की है
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
}
private bool _alpha = true;
public bool Alpha
{
get
{
return _alpha;
}
set
{
_alpha = value;
OnPropertyChanged("ControlA");
OnPropertyChanged("ControlB");
OnPropertyChanged("ControlC");
OnPropertyChanged("ControlD");
OnPropertyChanged("ControlE");
}
}
private bool _beta = true;
public bool Beta
{
get
{
return _beta;
}
set
{
_beta = value;
OnPropertyChanged("ControlA");
OnPropertyChanged("ControlB");
OnPropertyChanged("ControlC");
OnPropertyChanged("ControlD");
OnPropertyChanged("ControlE");
}
}
private bool _gamma = true;
public bool Gamma
{
get
{
return _gamma;
}
set
{
_gamma = value;
OnPropertyChanged("ControlA");
OnPropertyChanged("ControlB");
OnPropertyChanged("ControlC");
OnPropertyChanged("ControlD");
OnPropertyChanged("ControlE");
}
}
private bool _delta = true;
public bool Delta
{
get
{
return _delta;
}
set
{
_delta = value;
OnPropertyChanged("ControlA");
OnPropertyChanged("ControlB");
OnPropertyChanged("ControlC");
OnPropertyChanged("ControlD");
OnPropertyChanged("ControlE");
}
}
public Visibility ControlA
{
get
{
Visibility result = Visibility.Hidden;
if (Alpha && (Beta || Gamma))
{
result = Visibility.Visible;
}
return result;
}
}
public Visibility ControlB
{
get
{
Visibility result = Visibility.Hidden;
if (Delta)
{
result = Visibility.Visible;
}
return result;
}
}
private bool _controlC = false;
public bool ControlC
{
get
{
return Delta || Beta;
}
}
private bool _controlD = false;
public bool ControlD
{
get
{
return Gamma && Alpha && Delta;
}
}
private bool _controlE = false;
public bool ControlE
{
get
{
return Alpha || Gamma;
}
}
}
यहाँ कनवर्टर है:
public class BooleanVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if((value == null) || (!(value is bool)))
return Binding.DoNothing;
Visibility elementVisibility;
bool shouldCollapse = ((bool)value);
if(parameter != null)
{
try
{
bool inverse = System.Convert.ToBoolean(parameter);
if(inverse)
shouldCollapse = !shouldCollapse;
}
catch
{
}
}
elementVisibility = shouldCollapse ? Visibility.Collapsed : Visibility.Visible;
return elementVisibility;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
मुझे लगता है कि यह एक अच्छा दृष्टिकोण है –