2012-05-09 3 views
0

У меня есть новая проблема с кнопкой «Ярлык». Приведенный ниже код связывает вид модели представления:Ярлык не скрыт в привязке WPF

<Label Name="isImageValid" Content="Image not Created" Margin="0,7,1,0" Style="{StaticResource LabelField}" 
       Grid.ColumnSpan="2" Grid.Row="15" Width="119" Height="28" Grid.RowSpan="2" 
       Grid.Column="1" IsEnabled="True" 
       Visibility="{Binding isImageValid}" /> 

А следующий код из моей ViewModel:

private System.Windows.Visibility _isImageValid; 
public System.Windows.Visibility isImageValid 
     { 

      get 
      { 

       return _isImageValid; 
      } 
      set 
      { 


       _isImageValid = value; 
       this.RaisePropertyChanged(() => this.isImageValid); 

      } 
     } 
    private void OnImageResizeCompleted(bool isSuccessful) 
    { 

     if (isSuccessful) 
     { 

      this.SelectedStory.KeyframeImages = true; 
      isImageValid = System.Windows.Visibility.Visible; 
     } 
     else 
     { 
      this.SelectedStory.KeyframeImages = false; 

     } 
    } 

Этикетка предназначена для оставаться скрытым, пока «не OnImageResizeCompleted» называется, но по какой-то причине изображение постоянно видно. Что мне нужно изменить, чтобы скрыть это, пожалуйста?

+0

Вы установить начальное значение Hidden/Collapsed? – Alex

+0

Я не установил начальное значение, вы имеете в виду видимость в свойстве? – Usher

+0

Я хотел сказать, что по умолчанию значение вашего свойства фактически установлено на Visible, поэтому ваша метка видна изначально. Если остальная часть вашего кода верна, инициализация _isImageValid to Hidden или Collapsed должна сделать трюк. В любом случае, вы должны пойти с принятым ответом, поскольку это более универсальный подход. – Alex

ответ

2

Ваша проблема не в реальном режиме привязки, этикетке не требуется двусторонняя привязка, потому что обычно она не установлена ​​ ее источником.

Как предложено в @blindmeis, вы должны использовать конвертер вместо того, чтобы возвращать значение Видимости непосредственно из модели просмотра, есть одна встроенная в фреймворк, которую вы можете использовать. Вы также должны убедиться, что ваш datacontext установлен правильно, если это не так, метка не сможет привязываться к указанному свойству. У вас есть другие объекты в том же окне, которые правильно привязываются к viewmodel? Вы также должны проверить окно вывода для ошибок привязки - они будут упомянуты там. Наконец, вы также должны проверить, что ваше свойство уведомляет вас правильно - это невозможно сказать из предоставленного вами кода.

Элемент управления/окно должно выглядеть примерно так

<UserControl x:Class="..." 
       x:Name="MyControl" 

       xmlns:sysControls="clr-namespace:System.Windows.Controls;assembly=PresentationFramework" 

       > 
    <UserControl.Resources> 
     <sysControls:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
    </UserControl.Resources> 

    <Grid> 
     <Label Visibility="{Binding IsImageValid, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
    </Grid> 
</UserControl> 

и C#:

public class MyViewModel : INotifyPropertyChanged 
{ 

    public bool IsImageValid 
    { 
     get { return _isImageValid; } 
     set 
     { 
      _isImageValid = value; 
      OnPropertyChanged("IsImageValid"); 
     } 
    } 

    protected void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private bool _isImageValid; 
} 
+0

+1 был, ленив, чтобы привести пример с конвертером;) – blindmeis

+0

@blindmeis Я собирался просто отредактировать ваше сообщение, чтобы добавить это, но к тому времени, когда я разработал то, что я хотел сказать, это было слишком большим для редактирование на чужом ответе. – slugster

+0

@ slugster, большое спасибо. – Usher

0

установка Binding режима пытаются TwoWay

<Label Visibility="{Binding isImageValid, Mode=TwoWay}" /> 

все-таки я бы не использовать пространство имен System.Windows в ViewModel. создать свойство bool и использовать конвертер booltovisibility в вашей привязке.

+0

спасибо blindmeis, даже я получил этот код с помощью @shakti в stackoverflow – Usher

+0

Я попробовал Mode = TwoWay, похоже, не работает – Usher

+0

вы уверены, что datacontext установлен правильно? проверьте окно вывода. ваша привязка кода работает в моем тестовом проекте. – blindmeis

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