У меня есть статическое свойство bool в классе Model, которое я предоставляю двум различным классам ViewModel. Один из этих ViewModel имеет свойство bool, связанное с указанным статическим свойством, и связано с видимостью кнопки через конвертер. Затем этот параметр можно установить в пределах этого ViewModel равным true или false, и соответственно изменится видимость кнопки. (Экземпляр этой ViewModel установлен в XAML View, через DataContext, в котором находится кнопка) Я хочу, чтобы иметь возможность изменять эту видимость кнопок из другого представления, и я думал, что, имея свойство в мой отдельный ViewModel View, который также связан с моим статическим bool в моей оригинальной модели, я мог бы это сделать, но это ничего не делает.Проблема со статическими полями при связывании
Вот мой код:
MainModel
public class MainModel
{
static bool _ButtonIsVisible = true;
public static bool ButtonIsVisible
{
get { return _ButtonIsVisible; }
set { _ButtonIsVisible = value; }
}
}
MainViewModel
class MainViewModel: ObserveableObject
{
public bool ButtonIsVisible
{
get { return MainModel.ButtonIsVisible; }
set
{
MainModel.ButtonIsVisible = value;
RaisePropertyChanged("ButtonIsVisible");
}
}
}
MainView
<Window x:Class="MVVM.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:MVVM"
mc:Ignorable="d"
Title="MainWindow" Width="1920" Height="1080" WindowState="Maximized" WindowStyle="None">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
</Window.Resources>
<Button Visibility="{Binding ButtonIsVisible, Converter={StaticResource BoolToVisConverter}}" />
</Window>
ButtonIsVisible из MainViewModel изменяется внутри команды, и это работает так, как ожидается. Здесь происходят мои неприятности.
AnotherViewModel
class AnotherViewModel: ObserveableObject
{
public bool ButtonIsVisible
{
get { return MainModel.ButtonIsVisible; }
set
{
MainModel.ButtonIsVisible = value;
RaisePropertyChanged("ButtonIsVisible");
}
}
}
Экземпляр AnotherViewModel создаются с помощью DataContext в этом соответствующий вид, и команда связана с кнопкой в этой точке зрения, в которой я изменить свойство ButtonIsVisible от AnotherViewModel, в я бы ожидал, что моя кнопка из моего MainView изменится, увидев, что оба ViewModels получают и задают значения свойств, о которых идет речь, из статического свойства в моем MainModel, но это не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно?
Теперь я не могу сказать вам, почему он не работает, но мне действительно кажется, что это плохо для меня, используя статическое свойство для этого.Я бы предпочел изменить 'MainViewModel'' ButtonIsVisible'property из 'AnotherViewModel', возможно, отправив' MainViewModel'instance в 'AnotherViewModel' в конструкторе. – Pikoh
Теперь, когда я думаю об этом, в 'AnotherViewModel' вы вызываете' RaisePropertyChanged', но это повлияет на представление 'AnotherViewModel', а не' MainView'. 'MainView' не получает свойство измененное событие ... – Pikoh
Я должен признать, что даже мне самому не нравится использовать статические свойства для этого. Я могу найти лучший способ на более поздний срок, но сейчас я собираюсь с этим сделать мяч. Ваш второй комментарий имеет смысл, но есть ли способ обойти это? Могу ли я уведомить 'MainViewModel' изменения, внесенные в' AnotherViewModel'? –