我已将边框可见性设置为绑定到Views中名为P的类中的变量的边界,其中P是布尔类型。我在ViewModels的类中有另一个变量,称为M,其中M是字典,而Enum由三个元素组成,例如A,B和C。我如何将P绑定到M.value,如果P为false, M.value设置为A,如果P为true,则M.value设置为B或C(取决于某些条件),以便当M.value为B或C时边框可见,而M.value则边框不可见.value是A?
到目前为止,我已经实现了将边框可见性绑定到P上并且可以正常工作(当P为true时,它是可见的,而当P为false时,它不可见)。
enum E {
A,B,C
}
public class ClassInViews {
private bool picked = false;
public bool Picked {get; set;}
}
public class ClassInViewModels {
private Dictionary<(...An arbitrary class in Models),E> M;
}
答案 0 :(得分:1)
由于您要将其绑定到Dictionary的更改,因此我将使用ObservableDictionary并通过引发“ Picked”属性的更改事件来响应集合中的任何更改。因此,您的ViewModel必须实现INotifyPropertyChanged。
那么最简单的事情就是将您的逻辑写到P的getter中。
public bool Picked
{
get
{
/*Your logic here*/
}
}
第二个选项:您可以创建一个IValueConverter,将给定的目录转换为可见性。
public class Bool2VisibilityConverter : MarkupExtension, IValueConverter
{
static Bool2VisibilityConverter _converter;
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null)
{
_converter = new Bool2VisibilityConverter();
}
return _converter;
}
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var dic = value as ObservableDictionaray<YourTypesHere>;
if (dic == null)
return Visibility.Collapsed;
bool visible = /* Check the Dictionary with your logic */;
return (bool) visible ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementexException();
}
#endregion
}
然后您可以简单地使用它来转换字典:
<Button Visibility="{Binding Dictioanry, Converter={conv:Bool2VisibilityConverter}}" />