Как установить элемент XAML по умолчанию для текущего года? - PullRequest
2 голосов
/ 30 января 2020

Внизу у меня есть следующий код XAML, который соответствует числовому текстовому полю, выделенному на рисунке: Моя цель состоит в том, чтобы в этом числовом текстовом поле в качестве номера по умолчанию был выбран текущий год, если выбран переключатель «Текущий». В настоящее время по умолчанию используется значение 0, когда переключатель «Текущий выбран». Может ли это быть сделано через XAML в представлении или произойдет изменение в модели представления?

enter image description here

enter image description here

<tools:NumberTextBox x:Name="txtYear" FocusManager.FocusedElement="{Binding ElementName=txtYear}" Width="100" Text="{Binding Path=HistoryYear, UpdateSourceTrigger=PropertyChanged}"/>

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Вы можете использовать следующий код

<Window.Resources>
        <sys:String x:Key="YearStyle">yyyy</sys:String>
    </Window.Resources>

<TextBlock Text="{Binding 
           Source={x:Static sys:DateTime.Now},StringFormat={StaticResource YearStyle}}"/>

, где "sys:" определено как пространство имен System (показано ниже).

xmlns:sys="clr-namespace:System;assembly=mscorlib"
1 голос
/ 30 января 2020

Вы можете статически определить текущий год в XAML следующим образом:

<Window.Resources>
    <s:DateTime x:Key="CurrentYear">2020</s:DateTime>
</Window.Resources>

, где "s:" определяется как System (показано ниже), предоставляя вам доступ к объектам в пространство имен системы.

xmlns:s="clr-namespace:System;assembly=mscorlib"

ОДНАКО: Вы не должны делать это по нескольким причинам. Основным является то, что, насколько мне известно, вы не можете динамически получить текущий год, используя что-то вроде DateTime.Now в Window.Resources, потому что значение, хранящееся там, где «2020» находится в приведенном выше примере, должно быть строка. Это потребует ручного обновления каждый год, и т. Д. c.

Что вы должны сделать, это связать свойство Text TextBox со свойством в ViewModel или установить его в коде, если вы не используете модели представления в этом Проект еще. Это может быть достигнуто путем создания привязываемого свойства в модели представления, подобной этой

ViewModel

public string CurrentYear { get; set; }

public MainViewModel()
{
    // This could be set anywhere, but setting in the constructor like this works well for a default value.
    CurrentYear = DateTime.Now.Year.ToString();
}

Представление (xaml)

<!-- TwoWay Binding because the text can be updated by the user in the view, and it could be updated by the ViewModel -->
<TextBox Text="{Binding CurrentYear, 
                        Mode=TwoWay, 
                        UpdateSourceTrigger=PropertyChanged}" />

В качестве альтернативы, вы могли бы сделать это в коде, подобном этому

View.xaml

<TextBox x:Name="currentYearTextBox" />

View.xaml.cs (code-behind)

public MainWindow()
{
    InitializeComponent();
    currentYearTextBox.Text = DateTime.Now.Year.ToString();
}

Заключительные мысли: Если вы хотите отображать текущий год, только когда выбран «текущий», вы просто обновите значение CurrentYear на основе значения RadioButtons, et c. Это будет сделано в ViewModel или программном обеспечении в зависимости от архитектуры вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...