Используйте CodeBehind Boolean для обновления видимости элемента управления - PullRequest
1 голос
/ 14 февраля 2020

У меня есть следующий код:

public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        bool _myValue;
        public bool myValue
        {
            get { return _myValue; }
            set {
                _myValue = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("myValue"));
            }
        }

        public MainWindow() {
            myValue = false;
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromSeconds(1);
            timer.Tick += timer_Tick;
            timer.Start();
        }

        void timer_Tick(object sender, EventArgs e) { 
            myValue = !myValue;
            lblTime.Content = myValue.ToString();
        }
    }

и соответствующий xaml:

    <Window.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis" />
    </Window.Resources>
    <DockPanel Margin="10">
        <Button x:Name="HideMe"
             Height="50" Width="50"
            Cursor="Hand" 
            Visibility="{Binding Path=myValue, Converter={StaticResource BoolToVis}}"/>
        <Label x:Name="lblTime" />
    </DockPanel>

Что я пытаюсь сделать; обновляет видимость кнопки с каждым timer_tick; Ярлык обновляется, но привязка отказывается работать

Я очень уверен, что есть недосмотр, но после изучения многочисленных руководств я ничего не могу сказать о том, как я могу сделать эту работу ... большинство работает с флажком WPF; но мне нужно логическое значение в коде для отправки, чтобы контролировать видимость кнопки, как только она будет обновлена ​​..

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Установите DataContext окна на себя и не забудьте позвонить InitializeComponent():

public MainWindow()
{
    InitializeComponent();
    DataContext = this; //<--

    myValue = false;
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = TimeSpan.FromSeconds(1);
    timer.Tick += timer_Tick;
    timer.Start();
}
0 голосов
/ 14 февраля 2020

мм8 дал вам идеальный ответ на ваш вопрос (настройка контекста данных) - я просто хочу указать на одну небольшую вещь, которая должна сделать вашу жизнь намного проще при создании ваших свойств.

Мы можем создать функцию для запуска события изменения свойства, требуя от вас только написать «OnPropertyChanged ()» для запуска обновления пользовательского интерфейса. Чтобы сделать это, мы добавим 'void' ниже, сказав, что он будет использовать свойство с именем «Имя участника звонящего» по умолчанию, если только вы не предоставите имя свойства вручную (IE OnPropertyChanged («SomeOtherValue»);).

Для этого нам сначала нужно добавить оператор using в верхнюю часть вашего класса UserViewModel:

using System.Runtime.CompilerServices;

Затем мы добавим код OnPropertyChanged и включим имя члена вызывающего абонента. «Это должно выглядеть так:

    private void OnPropertyChanged([CallerMemberName] String name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

Теперь - мы обновим вашу собственность, чтобы использовать упрощенный метод:

   public bool myValue
   {
     get { return _myValue; }
     set
     {
            _myValue = value;
            OnPropertyChanged();
     }
}

Наконец - я лично предпочел бы упорядоченный способ получения / set's - То, что вы делаете, полностью в порядке, и нет необходимости менять его, если вы не хотите, но я бы посоветовал попробовать это так, чтобы увидеть, как вам это нравится :)

    public bool MyValue
    {
        get => _myValue; 
        set
        {
            // If the value hasn't changed, the code will return (Exit) - avoiding a false property changed trigger :) 
            if (_myValue == value) return;
            _myValue = value;
            OnPropertyChanged(); 
        }
    }

Основания: Проверка, действительно ли значение изменилось в вашем SET, предотвратит ложные срабатывания, вы используете меньше скобок, а intellisense делает написание этого супер легким!

Дайте мне знать, если у вас есть какие-либо вопросы!

...