Skip to content

Commit 39a0705

Browse files
committed
Coding standards; simplified.
You can read my opinions on abstract view models here: http://dragablz.net/2015/12/14/viewmodelbase-go-away/ ;)
1 parent 91b8710 commit 39a0705

File tree

4 files changed

+61
-91
lines changed

4 files changed

+61
-91
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.ComponentModel;
4+
using System.Runtime.CompilerServices;
5+
6+
namespace MaterialDesignColors.WpfExample.Domain
7+
{
8+
public static class NotifyPropertyChangedExtension
9+
{
10+
public static void MutateVerbose<TField>(this INotifyPropertyChanged instance, ref TField field, TField newValue, Action<PropertyChangedEventArgs> raise, [CallerMemberName] string propertyName = null)
11+
{
12+
if (EqualityComparer<TField>.Default.Equals(field, newValue)) return;
13+
field = newValue;
14+
raise?.Invoke(new PropertyChangedEventArgs(propertyName));
15+
}
16+
}
17+
}

MainDemo.Wpf/Domain/TextFieldsViewModel.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,22 @@ namespace MaterialDesignColors.WpfExample.Domain
1212
{
1313
public class TextFieldsViewModel : INotifyPropertyChanged
1414
{
15-
private readonly IList<int> _longListToTestComboVirtualization;
16-
1715
private string _name;
1816
private int _selectedValueOne;
1917

2018
public TextFieldsViewModel()
2119
{
22-
_longListToTestComboVirtualization = new List<int>(Enumerable.Range(0, 1000));
20+
LongListToTestComboVirtualization = new List<int>(Enumerable.Range(0, 1000));
2321

24-
SelectedValueOne = _longListToTestComboVirtualization.Skip(2).First();
22+
SelectedValueOne = LongListToTestComboVirtualization.Skip(2).First();
2523
}
2624

2725
public string Name
2826
{
2927
get { return _name; }
3028
set
3129
{
32-
_name = value;
33-
OnPropertyChanged();
30+
this.MutateVerbose(ref _name, value, RaisePropertyChanged());
3431
}
3532
}
3633

@@ -39,18 +36,17 @@ public int SelectedValueOne
3936
get { return _selectedValueOne; }
4037
set
4138
{
42-
_selectedValueOne = value;
43-
OnPropertyChanged();
39+
this.MutateVerbose(ref _selectedValueOne, value, RaisePropertyChanged());
4440
}
4541
}
4642

47-
public IList<int> LongListToTestComboVirtualization => _longListToTestComboVirtualization;
43+
public IList<int> LongListToTestComboVirtualization { get; }
4844

4945
public event PropertyChangedEventHandler PropertyChanged;
5046

51-
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
47+
private Action<PropertyChangedEventArgs> RaisePropertyChanged()
5248
{
53-
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
49+
return args => PropertyChanged?.Invoke(this, args);
5450
}
5551
}
5652
}

MainDemo.Wpf/Domain/TreesViewModel.cs

Lines changed: 36 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -10,106 +10,63 @@
1010

1111
namespace MaterialDesignColors.WpfExample.Domain
1212
{
13-
public sealed class Movie : BindableBase
13+
public sealed class Movie
1414
{
15-
private string _name;
16-
17-
public string Name
15+
public Movie(string name, string director)
1816
{
19-
get { return _name; }
20-
set
21-
{
22-
_name = value;
23-
OnPropertyChanged();
24-
}
17+
Name = name;
18+
Director = director;
2519
}
2620

27-
private string _director;
21+
public string Name { get; }
2822

29-
public string Director
30-
{
31-
get { return _director; }
32-
set
33-
{
34-
_director = value;
35-
OnPropertyChanged();
36-
}
37-
}
23+
public string Director { get; }
3824
}
3925

40-
public sealed class MovieCategory : BindableBase
26+
public sealed class MovieCategory
4127
{
42-
public string Name { get; }
43-
44-
public ObservableCollection<Movie> Movies { get; }
45-
46-
public MovieCategory(string name)
28+
public MovieCategory(string name, params Movie[] movies)
4729
{
4830
Name = name;
49-
Movies = new ObservableCollection<Movie>();
31+
Movies = new ObservableCollection<Movie>(movies);
5032
}
33+
34+
public string Name { get; }
35+
36+
public ObservableCollection<Movie> Movies { get; }
5137
}
5238

53-
public sealed class TreesViewModel : BindableBase
39+
public sealed class TreesViewModel : INotifyPropertyChanged
5440
{
41+
private object _selectedItem;
42+
5543
public ObservableCollection<MovieCategory> MovieCategories { get; }
5644

5745
public AnotherCommandImplementation AddCommand { get; }
5846

5947
public AnotherCommandImplementation RemoveSelectedItemCommand { get; }
6048

61-
private object _selectedItem;
6249
public object SelectedItem
6350
{
6451
get { return _selectedItem; }
6552
set
6653
{
67-
_selectedItem = value;
68-
OnPropertyChanged();
54+
this.MutateVerbose(ref _selectedItem, value, args => PropertyChanged?.Invoke(this, args));
6955
}
7056
}
7157

7258
public TreesViewModel()
7359
{
7460
MovieCategories = new ObservableCollection<MovieCategory>
7561
{
76-
new MovieCategory("Action")
77-
{
78-
Movies =
79-
{
80-
new Movie
81-
{
82-
Name = "Predator",
83-
Director = "John McTiernan"
84-
},
85-
new Movie
86-
{
87-
Name = "Alien",
88-
Director = "Ridley Scott"
89-
},
90-
new Movie
91-
{
92-
Name = "Prometheus",
93-
Director = "Ridley Scott"
94-
}
95-
}
96-
},
97-
new MovieCategory("Comedy")
98-
{
99-
Movies =
100-
{
101-
new Movie
102-
{
103-
Name = "EuroTrip",
104-
Director = "Jeff Schaffer"
105-
},
106-
new Movie
107-
{
108-
Name = "EuroTrip",
109-
Director = "Jeff Schaffer"
110-
}
111-
}
112-
}
62+
new MovieCategory("Action",
63+
new Movie ("Predator", "John McTiernan"),
64+
new Movie("Alien", "Ridley Scott"),
65+
new Movie("Prometheus", "Ridley Scott")),
66+
new MovieCategory("Comedy",
67+
new Movie("EuroTrip", "Jeff Schaffer"),
68+
new Movie("EuroTrip", "Jeff Schaffer")
69+
)
11370
};
11471

11572
AddCommand = new AnotherCommandImplementation(
@@ -121,27 +78,25 @@ public TreesViewModel()
12178
}
12279
else
12380
{
124-
int index = new Random().Next(0, MovieCategories.Count);
81+
var index = new Random().Next(0, MovieCategories.Count);
12582

12683
MovieCategories[index].Movies.Add(
127-
new Movie
128-
{
129-
Name = GenerateString(15),
130-
Director = GenerateString(20)
131-
});
84+
new Movie(GenerateString(15), GenerateString(20)));
13285
}
13386
});
13487

13588
RemoveSelectedItemCommand = new AnotherCommandImplementation(
13689
_ =>
13790
{
138-
if (SelectedItem is MovieCategory)
91+
var movieCategory = SelectedItem as MovieCategory;
92+
if (movieCategory != null)
13993
{
140-
MovieCategories.Remove(SelectedItem as MovieCategory);
94+
MovieCategories.Remove(movieCategory);
14195
}
142-
else if (SelectedItem is Movie)
96+
else
14397
{
14498
var movie = SelectedItem as Movie;
99+
if (movie == null) return;
145100
MovieCategories.FirstOrDefault(v => v.Movies.Contains(movie))?.Movies.Remove(movie);
146101
}
147102
},
@@ -152,9 +107,11 @@ private static string GenerateString(int length)
152107
{
153108
var random = new Random();
154109

155-
return String.Join(String.Empty,
110+
return string.Join(string.Empty,
156111
Enumerable.Range(0, length)
157-
.Select(v => (char) random.Next((int)'a', (int)'z' + 1)));
112+
.Select(v => (char) random.Next('a', 'z' + 1)));
158113
}
114+
115+
public event PropertyChangedEventHandler PropertyChanged;
159116
}
160117
}

MainDemo.Wpf/MainDemo.Wpf.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
<DependentUpon>Dialogs.xaml</DependentUpon>
8383
</Compile>
8484
<Compile Include="Domain\AnotherCommandImplementation.cs" />
85-
<Compile Include="Domain\BindableBase.cs" />
85+
<Compile Include="Domain\NotifyPropertyChangedExtension.cs" />
8686
<Compile Include="Domain\DemoItem.cs" />
8787
<Compile Include="Domain\DialogsViewModel.cs" />
8888
<Compile Include="Domain\ListFieldsViewModel.cs" />

0 commit comments

Comments
 (0)