2016-05-05 3 views
0

У меня есть статическое свойство 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, но это не работает. Может ли кто-нибудь сказать мне, что я делаю неправильно?

+0

Теперь я не могу сказать вам, почему он не работает, но мне действительно кажется, что это плохо для меня, используя статическое свойство для этого.Я бы предпочел изменить 'MainViewModel'' ButtonIsVisible'property из 'AnotherViewModel', возможно, отправив' MainViewModel'instance в 'AnotherViewModel' в конструкторе. – Pikoh

+0

Теперь, когда я думаю об этом, в 'AnotherViewModel' вы вызываете' RaisePropertyChanged', но это повлияет на представление 'AnotherViewModel', а не' MainView'. 'MainView' не получает свойство измененное событие ... – Pikoh

+0

Я должен признать, что даже мне самому не нравится использовать статические свойства для этого. Я могу найти лучший способ на более поздний срок, но сейчас я собираюсь с этим сделать мяч. Ваш второй комментарий имеет смысл, но есть ли способ обойти это? Могу ли я уведомить 'MainViewModel' изменения, внесенные в' AnotherViewModel'? –

ответ

1

В соответствии с вашими комментариями, у вас есть что-то вроде этого:

<ContentControl Content="{Binding ViewModel}" /> 

И если вы хотите, чтобы показать, что вы делаете это:

ViewModel = new AnotherViewModel(); 

Так что вам нужно в вашем AnotherViewModel является:

MainViewModel MVM; 

public AnotherViewModel(MainViewModel _mvm) 
{ 
    this.MVM=_mvm; 
} 

Вы должны затем изменить AnotherVieModel Instantation на:

ViewModel = new AnotherViewModel(this); 

И когда вы хотите изменить видимость кнопки, вы просто должны это сделать:

this.MVM.ButtonIsVisible=true; 

Как я уже говорил вам, что это просто способ сделать это, но я думаю, довольно прост и понятен. Если у вас есть сомнения, не стесняйтесь спрашивать.

+0

Я вижу, откуда вы родом, и это действительно выглядит относительно прямо и просто, и это здорово! У меня есть один вопрос, хотя, когда вы говорите: «Затем вы должны изменить свою Ментацию AnotherViewModel на: ' ViewModel = new AnotherViewModel (this); '" где именно это будет? В его нынешнем виде мой проект AnotherViewModel выполняется в xaml соответствующего Соответствия. –

+0

Ну, я всегда создаю видовую версию кода. Я предлагаю удалить его из xaml и в MainViewModel сделать что-то вроде «AnotherView w = new AnotherView(); w.DataContext = new AnotherViewModel (this); w.Show(); 'но не видя, как именно ваш код я больше не могу вам сказать :) – Pikoh

+0

Мне удалось сделать ' SelectedViewModel = new AnotherViewModel (this); 'когда я иду переключать представления, которые работают , однако, когда я пытаюсь 'this.MVM.ButtonIsVisible = true;' Я получаю исключение NullReferenceException, сообщая мне, что MVM не был настроен на экземпляр объекта, однако я вижу, что он настроен на мой MainViewModel при изменении представлений , так почему это становится нулевым, после этого выходит за меня? Спасибо за помощь! Я определенно двигаюсь в правильном направлении, я чувствую, что сейчас я рядом с этим! –

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