2016-04-09 4 views
0

私はXAMLが初めてで、より良い方法を探しています。 コードが変更されたときにすぐにUIが更新されないことに気付きました。XAML INotifyProperty UIを更新するように変更しました

私はINotifyPropertyChangedインターフェイスを使用したいので、GUIは変更と更新について通知されます。

最初はXAMLで、可視性をhidden(TextBlockまたはimageの場合)またはtrue(isCheckまたはisEnabled)に設定しました。

コードの背後にあるプログラムで、私はvisibleかfalseに設定します。

しかし、GUIは更新されません。以下は私のページの枠組みです。 ボタンをクリックすると、すべてのプロパティが変更(可視に変更)されます。

唯一の違いは、複数のページがあり、ボタンを使用してページ間を移動できることです。ユーザーがボタンをクリックすると、次のページに進み、UIを更新します。

今私はUIを更新するために変更を加えた後にUpdateGUI()を使用しています。 UpdateGUI();

public void UpdateUI() 
{ 
    //remove this function from the code below. 
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { })); 
} 

MainWindow.xaml

<Grid Margin=" 0, 20, 0, 0"> 
     <StackPanel Margin="20, 0, 0, 0"> 
      <StackPanel Orientation="Horizontal" > 
       <Image x:Name="CheckBox1Img" Margin="0, 2, 0, 0" Source="{StaticResource doneCheckImage}" Visibility="Hidden"/> 
       <CheckBox x:Name="Checkbox1" Content="CheckBox1"/> 
      </StackPanel> 

      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="CheckBox2Img" Margin="0, 2, 0, 0" Source="{StaticResource doneCheckImage}" Visibility="Hidden"/> 
       <CheckBox x:Name="Checkbox2" Content="CheckBox 2"/> 
      </StackPanel> 

      <StackPanel Orientation="Horizontal"> 
       <Image x:Name="CheckBox3Img" Margin="0, 2, 0, 0" Source="{StaticResource doneCheckImage}" Visibility="Hidden"/> 
       <CheckBox x:Name="CheckBox3" Content="CheckBox 3"/> 
      </StackPanel> 

      <Button x:Name="Button1" Click="Button1_Click" Height="20" Content="Click" Width="50"/> 
      <Button x:Name="Button2" Click="Button2_Click" Height="20" Content="Button to disable" Width="200"/> 
     </StackPanel> 
    </Grid> 

MainWindow.cs

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Button1_Click(object sender, RoutedEventArgs e) 
     { 
      Checkbox1.IsEnabled = false; 
      Checkbox2.IsEnabled = false; 
      Checkbox3.IsEnabled = false; 
      CheckBox1Img.Visibility = Visibility.Visible; 
      CheckBox2Img.Visibility = Visibility.Visible; 
      CheckBox3Img.Visibility = Visibility.Visible; 

      Button2.IsEnabled = false; 
     } 

     private void Button2_Click(object sender, RoutedEventArgs e) 
     { 

     } 

App.XAMLが

<Application.Resources> 
    <!-- Blue Check Image --> 
    <BitmapImage x:Key="doneCheckImage" UriSource="blueCheck.png" /> 
</Application.Resources> 
+0

MVVMパターンを調べましたか? UpdateUI関数の呼び出し方法 – Firoz

+0

コードの背後からコントロールのプロパティを設定すると、コントロールがすぐに更新されるはずです。 – slugster

答えて

1
  1. にViewModelに(シンプル.csファイルクラス)を追加します。新しいViewM odelsフォルダ
  2. このようにINotifyPropertyChangedのInteraceを実装します。これで新しい.csファイルクラスを作成します

    public class ViewModel:INotifyPropertyChanged{ 
    //Example for a valid INotifyPropertyChanged member 
    private bool _visibility; 
    
    public bool Visibility 
    { 
        get { return _visibility; } 
        set { _visibility = value; OnPropertyChanged("Visibility");} 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName){ 
          if (PropertyChanged != null) 
          { 
           PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
          } 
         } 
    } 
    

- BooleanToVisibilityConverter.csような何かそれを呼び出す:次のようになります

コード:

public class BooleanToVisibilityConverter : IValueConverter 
{ 
    object IValueConverter.Convert(object value, Type targetType, object parameter, string language) 
    { 
     if((bool)value == true) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Collapsed; 
     } 
    } 

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

このビューモードにバインドするxamlに移動します。そこlは<pageタグの後にこれを追加 - あなただけのViewModelに入力するとインテリセンスがお手伝いします:

xmlns:vm ="using:APPLICATIONNAME.ViewModels" 

さらにあなたのXAMLに追加します。

<Page.Resources> 
    <vm:ViewModel x:Key="MyVM"></vm:ViewModel> 
</Page.Resources> 

今、あなたのプロジェクトをビルドして、XAMLで選択しますデータをバインドするui要素を作成します。 次に、ui要素のプロパティウィンドウを開き、Visibilityを検索します。四角をクリックし、create dataBindingを押し、静的リソースを選択し、値コンバータをBooleanToVisibilityConverterに設定します。

enter image description here

あなたは、XAMLでのDataContextを設定することにより、C#で、あなたのviewmodelにアクセスすることができます。最初にmvvmの理論を深く見てみたいかもしれません。

関連する問題