@grzesiek51114 napisał:
Popatrz na komentarz, który napisał Ci @Ktos
no a @Ktos napisał:
Jest dostępna tylko, o ile używasz np. jakichś frameworków do MVVM; zazwyczaj ją ktoś już wtedy zrobił, a jak nie, to napisanie samemu to żaden problem.
Nie rozumiem. Nie używam frameworków. Przynajmniej nic o tym nie wiem. Oczywiście, że napisanie takiej klasy samemu, to żaden problem. I szkoda, że nie można dziedziczyć z dwóch klas. Ale pewnie dziedziczenie z takiej jednej też mi się przyda. Kiedyś :-).
Ale boję się, że wkrada się jakieś nieporozumienie. Dla mnie sprawa implementacji interfejsu INotifyPropertyChanged
jest zamknięta.
Ale przy okazji dziedziczenia @grzesiek51114 zachęcał, żeby nie obawiać się. Nie obawiam się. Programuję obiektowo już 20 lat. A teraz przyszedł czas na c#. W chwilach wolnych.
W Head First, w rozdziale 2, jest taka prostacka aplikacja WPF. Z początku to nawet jej nie robiłem. Za łatwa. Ale w rozdziale 10 wspomnieli, jak można (debugging) obejrzeć, z czego coś dziedziczy. Przykład został nazwany PractiseUsingIfElse.
W zacytowanym (aby uniknąć nieporozumień) poniżej kodzie zaznaczyłem, gdzie zalecają ustawić breakpoint. To mój jedyny dopisek.
MainWindow.xaml :
<Window x:Name="mainWindow" x:Class="UsingIfElse.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:UsingIfElse"
mc:Ignorable="d"
Title="Fun with if / else statements." Height="150" Width="450" WindowStartupLocation="CenterOwner">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button x:Name="changeText" Content="Change the label if checked" HorizontalAlignment="Center" VerticalAlignment="Center" Click="changeText_Click"/>
<CheckBox x:Name="enableCheckbox" Content="Enable label changing" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock x:Name="labelToChange" Grid.Row="1" TextWrapping="Wrap" Text="Press the button to set my text" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
MainWindow.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace UsingIfElse
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); // <----- tu wstawiamy breakpoint
}
private void changeText_Click(object sender, RoutedEventArgs e)
{
if (enableCheckbox.IsChecked != true)
{
labelToChange.Text = "Text changing is disabled";
labelToChange.HorizontalAlignment = HorizontalAlignment.Center;
} else
{
if (labelToChange.Text == "Left")
{
labelToChange.Text = "Right";
labelToChange.HorizontalAlignment = HorizontalAlignment.Right;
} else
{
labelToChange.Text = "Left";
labelToChange.HorizontalAlignment = HorizontalAlignment.Left;
}
}
}
}
}
I sprawdziłem, że w vs2010 uzyskujemy takie drzewko z base
, jak na wcześniej załączonym obrazku. Czyli w vs2010 umiem zobaczyć, z czego dziedziczę. Ale w vs2015 (na tej samej maszynie) mam:
I nie ma base
. Przynajmniej na pierwszym poziomie drzewka. A przejrzałem całą listę. No to w c#, w vs2015 mam kłopot z dziedziczeniem. Jak na razie jedyny mi znany. Pewnie kiedyś się wyjaśni.