2015-11-20 54 views
0

我有一個類(不是ViewModel),它有一個屬性決定了按鈕的可見性。我已經包含在用戶控件的資源按鈕綁定到屬性的可見性沒有得到更新

<UserControl.Resources> 
    <helpers:DialogLayoutConfigInfo x:Key="DialogConfigInfo"/> 
    <BooleanToVisibilityConverter x:Key="BoolToVis" /> 
</UserControl.Resources> 

類我有按鈕的知名度勢必會在「DialogLayoutConfigInfo」類的屬性。

private bool isButtonVisible; 
public bool IsButtonVisible 
{ 
    get { return isButtonVisible; } 
    set { isButtonVisible= value; OnPropertyChanged("IsButtonVisible"); } 
} 

<Button Visibility="{Binding Source={StaticResource DialogConfigInfo}, 
Path=IsButtonVisible, Converter={StaticResource BoolToVis}}"> 

如果我更新「DialogLayoutConfigInfo」類的構造函數的性質「IsButtonVisible」,能見度更新。但是當調用構造函數時,我沒有XML文件(用於獲取信息來設置屬性)。所以我調用一個函數,稍後更新屬性。爲什麼如果我在函數中設置可見性不會更新?

設置屬性的函數從我的視圖的代碼後面調用。

+0

是IsButtonVisible在輔助線程中設置?此外,根據您的發佈代碼,似乎'DialogLayoutConfigInfo'實現了'INotifyPropertyChanged'接口。但是,你能證實嗎? – user1672994

+0

不是。它沒有在輔助線程中設置,並且是。它確實實現了'INotifyPropertyChanged'。 – nan

+0

顯示您的'BooleanToVisibilityConverter' – WiiMaxx

回答

-2

基本上它實現了通過內置類在.net BooleanToVisibilityConverter

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

例子:

XAML:

<Button Content="Hello, I am the button" Visibility="{Binding ShowButton, Converter={StaticResource booleanVisibilityConverter}}"/> 

你的類:

private bool _showButton = false; 
public bool ShowButton 
{ 
    get { return _showButton; } 
    set 
    { 
     if (value != _showButton) 
     { 
     _showButton = value; 
     OnPropertyChanged("ShowButton"); 
     } 
    } 
} 

如果你想改變代碼的ButtonVisibility,你可以通過這個代碼視圖模型使它:

//Show error Message 
IsButtonVisible = false; 

您的情況:

這是沒有必要實施IValueConverterVisibility完全沒有IValueConverter(參見上面的示例)通過內置BooleanToVisibilityConverter Class.Net中被更改。您的情況:

private bool isButtonVisible; 
public bool IsButtonVisible 
{ 
    get { return isButtonVisible; } 
    set { isButtonVisible= value; OnPropertyChanged("IsButtonVisible"); } 
} 

XAML:

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="booleanVisibilityConverter"/> 
</UserControl.Resources> 
<Button Visibility="{Binding IsButtonVisible", Converter={StaticResource booleanVisibilityConverter}}"/> 
+0

我添加了一個「BooleanToVisibility」轉換器。檢查我的XAML。如果我在構造函數中設置屬性,則可見性會更新。只有當我在一個函數中設置屬性時,它纔會被取消。 – nan

+0

我知道。但我從XML中的信息設置屬性。它在XML中是布爾型的。所以我必須使用轉換器。轉換似乎不成問題,因爲它在構造函數中設置時會起作用。 – nan

+2

根據最佳實踐,您不得**在您的虛擬機中使用UI元素,因此不建議使用'System.Windows.Visibility' – WiiMaxx

0

我想你應該更新這樣

public class DialogLayoutConfigInfo : INotifyPropertyChanged 
{ 
    /// <summary> 
    /// Property Change Event 
    /// </summary> 
    public event PropertyChangedEventHandler PropertyChanged; 

    /// <summary> 
    /// Property Change Method 
    /// </summary> 
    /// <param name="prop">Property Name</param> 
    internal void RaisePropertyChanged(string prop) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
     } 
    } 

    public static DialogLayoutConfigInfo instance; 

    public DialogLayoutConfigInfo() 
    { 
     if (instance == null) 
     { 
      instance = this; 
     } 

     IsButtonVisible = Visibility.Visible; 

    } 
    private Visibility isButtonVisible; 
    public Visibility IsButtonVisible 
    { 
     get 
     { 

      return isButtonVisible; 
     } 
     set 
     { 
      isButtonVisible = value; 
      this.RaisePropertyChanged("IsButtonVisible"); 
     } 
    } 
} 

和你DialogLayoutConfigInfo類的代碼背後應該像

DialogLayoutConfigInfo.instance.IsButtonVisible = Visibility.Collapsed; 
相關問題