C# EventHandler красивый код (как к?)

Это как задумано. Java 7 изменила способ работы Locale.getDefault(). В Oracle был обнаружен дефект, но в основном они сказали, что это As Designed.

Подводя итог, вы должны изменить язык интерфейса ОС. Только изменение формата региона уже недостаточно.

Прочитайте отчет об ошибке здесь: Locale.getDefault () возвращает неправильный языковой стандарт для Java SE 7

5
задан Community 23 May 2017 в 12:26
поделиться

8 ответов

private void listBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
        var listBoxItem = sender as ListBoxItem;
        if (listBoxItem == null) return;

        var clickObject = listBoxItem.DataContext as ClickObject;
        if (clickObject == null) return;

        clickObject.SingleClick();
}
3
ответ дан 18 December 2019 в 13:18
поделиться

Я люблю хороший, чистый код, но в большинстве случаев чистый и элегантный не означает короткий и умный. Краткость кода хороша для соревнований. Замена оператора if not null на foreach может показаться более интересной, но всем остальным, кто работает над проектом, труднее понять, чего вы пытаетесь достичь. Поверьте, через несколько месяцев даже вы этого не вспомните: P. Ваш код и так хорош!

8
ответ дан 18 December 2019 в 13:18
поделиться

One-liner:

private void listBox_SelectionChangedA(object sender, SelectionChangedEventArgs e)
{
    As<ListBox>(sender, (lB) => StatusBoxA.Text = "Elements selected" + lB.SelectedItems.Count);
}

or, nested:

private void listBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    As<ListBoxItem>(sender, (listBoxItem) => {
        As<ClickObject>(listBoxItem.DataContext,
            (clickObject) => clickObject.SingleClick());
    };
}

using this static generic method (T is destination type, input is object to cast, code is a delegate (or lambda expression) to execute on success:

static void As<T>(object input, Action<T> code) where T : class
{
  T foo = input as T;
  if (foo != null)
  code(foo);
}
2
ответ дан 18 December 2019 в 13:18
поделиться

Maybe I am just being pedantic but why do you need to cast the sender if you are using the event within its host containers code.

Regardless of who made the change to a list, couldn't you just give your listbox a name and use that.

<ListBox x:Name="listbox1" />

private void listBox_SelectionChangedA(object sender, SelectionChangedEventArgs e)
{
    StatusBoxA.Text = "Elements selected" + listbox1.SelectedItems.Count;
}

Or you could even achieve some of this using binding with no code behind.

0
ответ дан 18 December 2019 в 13:18
поделиться

Поскольку вы используете известные события из платформы .NET (в отличие от третьего party), и из кода кажется, что вы используете эти методы только для определенных классов (например, ListBoxItems и ListBoxes), есть несколько вещей, которые вы знаете , чтобы быть правдой:

  • отправитель никогда не будет нулевым
  • отправитель всегда будет ListBoxItem или ListBox соответственно

Так зачем использовать оператор как ? Просто приведите!

Тогда первый фрагмент станет

private void listBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
        var listBoxItem = (ListBoxItem)sender;
        var clickObject = (ClickObject)listBoxItem.DataContext;
        clickObject.SingleClick();
}

Обратите внимание, что это неверно в общем случае (вы бы не сделали этого, если бы вы обрабатывали все события PreviewMouseDown в одном обработчике для всех типов Control), но для такой код обработки событий, особенно в коде пользовательского интерфейса,

1
ответ дан 18 December 2019 в 13:18
поделиться

You can add extensions methods to Form elements, which can then trigger the events:

public static void OnSelectionChanged(this ListBox b, Action<ListBox> a)
{
    b.SelectedIndexChanged += (s,e) =>
    {
        if (s is ListBox)
           a(s as ListBox);           
    };
}
0
ответ дан 18 December 2019 в 13:18
поделиться

This is supposed to be the same as the first one, reformatted a little:

private void listBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    ClickObject clickObject;
    if (
        ((sender as ListBoxItem) != null) &&
        ((clickObject = ((ListBoxItem)sender).DataContext as ClickObject) != null)
        )
    {
        clickObject.SingleClick();
    }
}
0
ответ дан 18 December 2019 в 13:18
поделиться

Используя ту же идею, что и решение Утаала, но как метод расширения ...

public static void As<TSource>(this object item, Action<TSource> action) where TSource : class
{
    var cast = item as TSource;

    if (cast != null)
        action(cast);
}

private void listBoxItem_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    sender.As<ListBoxItem>(listBoxItem => 
        listBoxItem.DataContext.As<ClickObject>(clickObject =>
            clickObject.SingleClick()));
}
0
ответ дан 18 December 2019 в 13:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: