ViewModel:Почему WPF Window.Visibility binding должен иметь Mode = TwoWay для вызова свойства?
public FloatingToolbarWindowViewModel(GuiItems guiItems)
{
GuiItemsInstance = guiItems;
GuiItemsInstance.Host = Host;
GuiItemsInstance.RefreshVisibility = RefreshVisibility;
}
private Visibility _windowVisibility;
public Visibility WindowVisibility
{
get { return _windowVisibility; }
set
{
//raises PropertyChanged-event
SetValue(ref _windowVisibility, value);
}
}
// this check if any of the toolbars should be in a window and then sets visibility
public void RefreshVisibility(int RoleId)
{
if (GuiItemsInstance.ToolbarItems.Any(i => i.ToolbarLocation == ToolbarLocation.Float && i.RoleId == RoleId))
WindowVisibility = Visibility.Visible;
else
WindowVisibility = Visibility.Hidden;
}
XAML:
Visibility="{Binding WindowVisibility, Mode=TwoWay}"
Это означает, что она никогда не может работать, потому что в конце концов ShowWindow обновляет свойство Visible, даже если инициализация будет иметь «решили», что должно быть скрыто ,
Так что я делаю, это хак в коде файла:
public partial class FloatingToolbarWindow : Window
{
public FloatingToolbarWindow()
{
InitializeComponent();
ContentRendered += FloatingToolbarWindow_ContentRendered;
}
private void FloatingToolbarWindow_ContentRendered(object sender, EventArgs e)
{
((FloatingToolbarWindowViewModel)DataContext).RefreshWindowVisibility();
}
ViewModel дополнительный Hack-метод:
public void RefreshVisibility()
{
RefreshVisibility(GuiItemsInstance.ActiveRoleId);
}
Есть ли способ сделать это без этого ужасного хака. Кроме того, не следует ли это работать с Mode = OneWay привязки в 1-м месте?
Что такое 'SetValue (ref _windowVisibility'? Почему не 'SetValue (*. VisibilityProperty'? –
извините, это метод абстрактного класса ViewModel, который я использую .. он вызывает событие PropertyChanged.Это вызывает вызов, но только когда TwoWay - привязка. –
Что такое« ShowWindow », «Вы имеете в виду Window.Show? –