저는 C#의 초보자이며 MSDN 블로그의 INotifyPropertyChanged Event Handler
에 대해 읽고 "stackoverflow"에서 검색했습니다. 하지만 실제로 코드에서 구현하는 방법과 이벤트와 속성을 함께 바인딩해야하는 방법을 이해하지 못합니다.Cant가 INotifyPropertyChanged 구현을 이해합니다.
는 이미 INotifyPropertyChanged
와 BindingClass
을 만들었습니다 그리고 코드는 다음과 같습니다
namespace Testing.Pages
{
class BindingClass : INotifyPropertyChanged
{
private string _setting;
public event PropertyChangedEventHandler PropertyChanged;
public BindingClass()
{
}
public BindingClass(string value)
{
_setting = value;
}
public string SettingProperty
{
get { return _setting; }
set
{
_setting = value;
// calling OnPropertyChanged whenever the property gets updated
}
}
protected void OnPropertyChanged([CallerMemberName] string _setting = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(_setting));
}
}
}
<TextBlock x:Name="PopupText"
Grid.Row="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Margin="0,0,0,20"
Text="Your theme will be updated next time you start the app."
TextWrapping="Wrap"
Visibility="Collapsed">
<TextBlock.Resources>
<Storyboard x:Name="popup_animate">
<DoubleAnimation Duration="0:0:2"
Storyboard.TargetName="PopupText"
AutoReverse="True"
From="0.0"
To="1.0"
BeginTime="{x:Bind }"
Storyboard.TargetProperty="(TextBlock.Opacity)"
></DoubleAnimation>
</Storyboard>
</TextBlock.Resources>
</TextBlock>
<TextBlock Text="Change Theme?"
Margin="10,10,0,0"></TextBlock>
<RadioButton x:Name="DarkTheme_btn"
Click="ChangeTheme_btn_Click"
Content="Dark Theme"
Margin="10,0,0,0"
GroupName="theme"></RadioButton>
<RadioButton x:Name="LightTheme_btn"
Click="ChangeTheme_btn_Click"
Content="Light Theme"
Margin="10,0,0,0"
GroupName="theme"></RadioButton>
SettingsPage.xaml
및 코드 숨김 파일 SettingsPage.xaml.cs
은 다음과 같습니다
namespace Testing.Pages
{
/// <summary>
/// An empty page that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class SettingsPage : Page
{
BindingClass notifyProperty = new BindingClass();
public SettingsPage()
{
this.InitializeComponent();
NavigationCacheMode = NavigationCacheMode.Enabled;
}
private void ChangeTheme_btn_Click(object sender, RoutedEventArgs e)
{
DataContext = notifyProperty;
int notifySettings = 0;
if ((bool)DarkTheme_btn.IsChecked)
{
notifySettings = 2;
AppSettings.saveThemeSettings(notifySettings);
PopupText.Visibility = Visibility.Visible;
popup_animate.Begin();
}
else if ((bool)LightTheme_btn.IsChecked)
{
notifySettings = 1;
AppSettings.saveThemeSettings(notifySettings);
PopupText.Visibility = Visibility.Visible;
popup_animate.Begin();
}
}
}
}
이미 LocalSettingsFolder
에서 응용 프로그램의 설정을 변경하려면 int notifySettings
을 사용하고 있습니다 및 응용 프로그램의 모든 시간은 App.xaml
의 설정을로드 다시 시작합니다. 설정을 변경할 때마다 다른 class
에서 함수를 호출하고 설정을 변경하고 을 SettingsPage.xaml
에 두 개 클릭하면 설정이 변경되고 animation
이 재생됩니다. 이것은 오래된 방법입니다.
이제는 Theme Settings
이 업데이트 될 때마다 및 PopupText
애니메이션을 재생할 필요가 없도록 이러한 이벤트를 함께 바인딩해야합니다. 이것이 내가 INotifyPropertyChanged Event
에 대해 배울 수있는 방법입니다.
int notifySettings
은 int
값을 전달하여 그에 따라 설정을 변경합니다. 1 = LightTheme 및 2 = DarkTheme. 여기
는 Settings Class
입니다 :
namespace Testing.Pages
{
class AppSettings
{
public static void saveThemeSettings(int value)
{
ApplicationDataContainer themeSettings = ApplicationData.Current.LocalSettings;
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
themeSettings.Values["AppThemeSetting"] = value.ToString();
}
public static string readThemeSettings()
{
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
string appSettingsString = "error, nothing found";
if (localSettings.Values.ContainsKey("AppThemeSetting"))
{
appSettingsString = localSettings.Values["AppThemeSetting"]?.ToString();
}
return appSettingsString;
}
public static void removeLocalSettings(string settingValue)
{
ApplicationData.Current.LocalSettings.Values.Remove(settingValue);
}
}
}
모호성이 알려 주시면 더 설명하려고 할 수 있습니다하시기 바랍니다 여전히 존재합니다. 나는 누군가가 이것에 관해 나를 도울 수 있기를 바란다.
업데이트 : 나는 대니 Bogers 의해 답변을하지만 필요한 Animation
가 시작되지 않고 나는 기능도 호출되고 있지 않기 때문에이 생각에 따라 내 프로젝트를 변경 한
. 나는 더 많은 변화를 시도하고 혼자서 일을하려했지만 실제로는 효과가 없었으므로 다른 누군가가 해결책을 찾을 때까지 내 자신의 방법을 사용하여 변경 작업을 수행 할 것입니다.
'// 속성이 업데이트 될 때마다 OnPropertyChanged를 호출합니다.', 실제로 코드를 표시해야합니까, 아니면 실제 코드에 해당 주석이 있습니까? –
나는 마이크로 소프트 블로그에서 실제로 코드를 얻었고 조금 편집했다. 하지만 어떻게 이러한 기능을 함께 구현할 수 있는지 알아야합니다. 그래서 나는 그것에 대해 배울 수 있습니다. – Ahmar