#wpf #binding #font-awesome #listviewitem
#wpf #привязка #шрифт-потрясающий #элемент listviewitem
Вопрос:
Я использую «FontAwesome.WPF» nuget.
Вот как выглядит объект ListView
public class Item
{
public string LocalizationNameVariable { get; set; }
public string LocalizationDescriptionVariable { get; set; }
public FontAwesomeIcon IsAlertToggleActive { get; set; }
}
Вот как в настоящее время выглядит столбец ListView:
<GridViewColumn Header="{Binding Translation.IsAlertActive, FallbackValue=IS_ALERT_ACTIVE}" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Grid Height="24" Width="24">
<fa:ImageAwesome Visibility="Visible" Icon="ToggleOff" MouseUp="AlertModeAlertActiveToggle_MouseUp" />
</Grid>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
В текстовом поле я использую следующее, здесь значение берется из ListView и сохраняется в элементе, который работает.
<TextBox d:DataContext="{d:DesignInstance models:Item}" Text="{Binding (models:Item.AlertModeMinSellPriceIsUndercutPrice)}" MaxLength="12" Height="24" Width="65" PreviewTextInput="TxtBoxMinSellPriceIsUndercutPrice_OnPreviewTextInput"></TextBox>
Но я хотел бы иметь возможность изменять значения для значка переключения в обоих направлениях.
Должен ли я использовать PropertyChanged или это невозможно с помощью FontAwesome?
Ответ №1:
Вы всегда должны реализовывать inotifypropertychanged в любой viewmodel.
Элемент — это viewmodel.
Если вы читаете fontawesome md, он указывает, что в примере проекта есть пример привязки изображения.
Mainwindow здесь:
<fa:FontAwesome
Icon="{Binding Path=Icon}"
FontSize="{Binding ElementName=FontSizeSlider, Path=Value}"
VerticalAlignment="Center" Margin="0,0,10,0" />
Viewmodel здесь:
public class MainViewModel
{
public ObservableCollection<IconDescription> Icons { get; set; }
public MainViewModel()
{
Icons = new ObservableCollection<IconDescription>();
var icons = Enum.GetValues(typeof (FontAwesomeIcon)).Cast<FontAwesomeIcon>()
.Where(t => t != FontAwesomeIcon.None)
.OrderBy(t => t, new IconComparer());
foreach (var icon in icons)
{
var memberInfo = typeof(FontAwesomeIcon).GetMember(icon.ToString()).FirstOrDefault();
if(memberInfo == null) continue; // alias
foreach (var cat in memberInfo.GetCustomAttributes(typeof(IconCategoryAttribute), false).Cast<IconCategoryAttribute>())
{
var desc = memberInfo.GetCustomAttributes(typeof(DescriptionAttribute), false).Cast<DescriptionAttribute>().First();
var id = memberInfo.GetCustomAttributes(typeof(IconIdAttribute), false).Cast<IconIdAttribute>().FirstOrDefault();
Icons.Add(new IconDescription { Category = cat.Category, Description = desc.Description, Icon = icon, Id = id == null ? null : id.Id });
}
}
}
public class IconComparer
: IComparer<FontAwesomeIcon>
{
public int Compare(FontAwesomeIcon x, FontAwesomeIcon y)
{
return String.Compare(x.ToString(), y.ToString(), System.StringComparison.InvariantCultureIgnoreCase);
}
}
}
public class IconDescription
{
public string Description { get; set; }
public FontAwesomeIcon Icon { get; set; }
public string Category { get; set; }
public string Id { get; set; }
}