/// <summary>
/// Запускаем обновление временни на малом табло
/// </summary>
private void StartRefrashDateTime()
{
Task.Factory.StartNew(() =>
{
while (true)
{
Dispatcher.Invoke(() =>
{
ClockBox.Text = DateTime.Now.ToString("HH:mm");
});
Task.Delay(1000);
}
});
}
public partial class SmallWindow : Window
{
private readonly DispatcherTimer _timer;
/// <summary>
/// Инициализация класса, малоко окна
/// </summary>
public SmallWindow()
{
InitializeComponent();
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromSeconds(1);
_timer.Tick += OnTimerTick;
// Запускаем обновление временни на малом табло
_timer.Start();
}
private void OnTimerTick(object sender, EventArgs e)
{
ClockBox.Text = DateTime.Now.ToString("HH:mm");
}
}
<ItemGroup>
<PackageReference Include="Extended.Wpf.Toolkit" Version="4.1.0" />
<PackageReference Include="MvvmLightLibsStd10" Version="5.4.1.1" />
<PackageReference Include="WpfScreenHelper" Version="1.0.0" />
</ItemGroup>
using GalaSoft.MvvmLight;
namespace Monitor
{
public class CentralInfoViewModel : ViewModelBase
{
private short _period;
private string _name;
/// <summary>
/// Номер текущего периода
/// </summary>
/// <value>short</value>
public short Period
{
get => _period;
set
{
if (value < 0)
value = 0;
// Это тоже самое, что и OnPropertyChanged(nameof(Period));, только ещё и обновляет поле
Set(ref _period, value);
}
}
public string Name
{
get => _name;
set
{
if (Set(ref _name, value))
{
// Свойство изменилось, что-то делаем
}
}
}
}
}
public short PlayerNomber
{
get => _PlayerNomber;
set
{
_PlayerNomber = value;
OnPropertyChanged("PlayerNomber");
}
}
public short PlayerNomber
{
get => _PlayerNomber;
set
{
_PlayerNomber = value;
OnPropertyChanged(nameof(PlayerNomber));
}
}
OnPropertyChanged();
public void OnPropertyChanged([CallerMemberName] string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
<Style TargetType="TextBlock" BasedOn="{StaticResource BaseFontFamily}">
Еще пришлось x:Name="NubmersStyle" поменять на x:Key="NubmersStyle"
public class TestScript : MonoBehaviour
{
[SerializeField] private List<TestEvent> _testEvents;
private int a = 3;
void Start()
{
var element = GetFirstOrDefault(_testEvents, item => item.B == a);
if (element is not null)
{
c = element.c;
r = element.r;
u = element.u;
}
}
// Если совпадение не найдено, то вернуть значение по умолчанию.
private static T GetFirstOrDefault<T>(IEnumerable<T> items, Func<T, bool> predicate)
{
foreach (var item in items)
{
if (predicate(item))
{
return item;
}
}
return default;
}
}
public class TestScript : MonoBehaviour
{
[SerializeField] private List<TestEvent> _testEvents;
private int a = 3;
void Start()
{
var element = GetFirst(_testEvents, item => item.B == a);
c = element.c;
r = element.r;
u = element.u;
}
// Если нужно найти первый элемент в любом случае, его отсуствие это ошибка.
private static T GetFirst<T>(IList<T> items, Func<T, bool> predicate)
{
for (int i = 0; i < items.Count; i++)
{
if (predicate(items[i]))
{
return items[i];
}
}
throw new InvalidOperationException("No matches found.");
}
}
Нет, не надо. Его и у тебя в коде не надо каждый раз объявлять. Ты можешь создать абстрактный класс ViewModelBase и там реализовать интерфейс. И потом от него наследоваться вью моделями. Только зачем? Например, я уже на второй работе использую MvvmLight. На первой я сам его заюзал, на вторую уже пришёл, он там был в проекте. Правда сейчас у меня UWP, а не WPF. После WPF та ещё боль, там урезан функционал биндингов и вообще много мелочей отличаются.