Есть ли способ привязать переменную к другой переменной?(Проект WPF) - PullRequest
0 голосов
/ 24 июня 2019

Я установил привязку видимости границы к переменной в классе в представлениях, называемых 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 is A?

До сих пор я реализовал привязку видимости границы к P уже, и она работает (когда P истинно, это видно, а когда P ложно, это не видно).

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;
}

1 Ответ

1 голос
/ 24 июня 2019

Так как вы хотите связать его с изменениями в Словаре, я бы тогда использовал ObservableDictionary и отвечал на любые изменения в коллекции, вызывая измененное событие для свойства "Picked". Таким образом, ваша ViewModel должна реализовать INotifyPropertyChanged.

Тогда самое простое - записать свою логику в получатель P.

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}}" />
...