2016-01-15 3 views
0

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-м месте?

+0

Что такое 'SetValue (ref _windowVisibility'? Почему не 'SetValue (*. VisibilityProperty'? –

+0

извините, это метод абстрактного класса ViewModel, который я использую .. он вызывает событие PropertyChanged.Это вызывает вызов, но только когда TwoWay - привязка. –

+0

Что такое« ShowWindow », «Вы имеете в виду Window.Show? –

ответ

0

Я бы сделать WindowVisibility только для чтения свойства:

public Visibility WindowVisibility 
{ 
     get 
     { 
     if (GuiItemsInstance.ToolbarItems.Any(i => i.ToolbarLocation == ToolbarLocation.Float && i.RoleId == RoleId)) 
     return Visibility.Visible; 
    else 
     return Visibility.Hidden; 
    } 
} 

связывания видимость OneWay:

Visibility="{Binding WindowVisibility, Mode=OneWay}" 

, а затем, когда вы «обновить» видимость просто поднимите свойство изменилось .. . Я не знаю, что вы используете, может либо

OnPropertyChanged("WindowVisibility"); 

или

OnPropertyChanged(() => WindowVisibility); 
+0

спасибо! любое объяснение, почему это сработает, если проблема в том, что get никогда не вызывается, если привязка не является TwoWay? –

+0

Извините, не вызывайте при поднятии события. –

+0

OneWay не работает, но TwoWay –

Смежные вопросы