Как изменить шрифт в динамически создаваемом textbox'e
Это моя View:
<StackPanel>
<ItemsControl Name="Control" ItemsSource="{Binding TestList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Name="Block" Text="{Binding Id}" ></TextBlock>
<TextBox Text="{Binding Text}" FontSize="{Binding FontSize}" Tag="{Binding Id}" PointerReleased="InputElement_OnPointerReleased"></TextBox>
<CheckBox IsChecked="{Binding Check}" IsCheckedChanged="ToggleButton_OnIsCheckedChanged"></CheckBox>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Command="{Binding AddNewRow}" Content="Add new row"/>
<ComboBox Name="checksize" ItemsSource="{Binding FontSize}" SelectedItem="{Binding CurrentFontSize}"/>
<TextBox Name="findid" Text="{Binding FindId, Mode=TwoWay}"/>
<CheckBox Name="select" IsChecked="{Binding Select}" Command="{Binding SelectAll}"/>
</StackPanel>
Это моя модель:
private string _text;
private int _id;
private float _fontsize;
private bool _check;
public int Id
{
get => _id;
set => this.RaiseAndSetIfChanged(ref _id, value);
}
public bool Check
{
get => _check;
set => this.RaiseAndSetIfChanged(ref _check, value);
}
public string Text
{
get => _text;
set => this.RaiseAndSetIfChanged(ref _text, value);
}
public float FontSize
{
get => _fontsize;
set => this.RaiseAndSetIfChanged(ref _fontsize, value);
}
Это моя VM:
public class MainWindowViewModel : ViewModelBase
{
private ObservableCollection<Test> _testlist;
public ObservableCollection<Test> TestList
{
get => _testlist;
set => this.RaiseAndSetIfChanged(ref _testlist, value);
}
public ReactiveCommand<Unit, Unit> AddNewRow { get; } // команда для доабвления новой пустой ячейки
public ReactiveCommand<Unit, Unit> SelectAll { get; } // команда для доабвления новой пустой ячейки
private bool? _select = false;
public bool? Select
{
get => _select;
set => this.RaiseAndSetIfChanged(ref _select, value);
}
private float _currentfontSize = 20;
private int id;
public float CurrentFontSize
{
get => _currentfontSize;
set
{
bool flag = false;
for (int i = 0; i < TestList.Count; i++)
{
if (TestList[i].Check)
{
flag = true;
TestList[i].FontSize = value;
}
}
if (flag) return;
this.RaiseAndSetIfChanged(ref _currentfontSize, value);
TestList[FindId].FontSize = CurrentFontSize;
}
}
public List<float> FontSize { get; set; }
public int _findId;
public int FindId
{
get => _findId;
set => this.RaiseAndSetIfChanged(ref _findId, value);
}
public MainWindowViewModel()
{
FontSize = new List<float>();
for (float i = 5; i < 10; i += 0.2F)
{
FontSize.Add(new List<float> { (float)Math.Round(i, 1) });
}
for (float i = 10; i < 73; i++)
{
FontSize.Add(new List<float> { (float)Math.Round(i, 1) });
}
TestList = new ObservableCollection<Test>(new List<Test>());
AddNewRow = ReactiveCommand.Create(() =>
{
TestList.Add(new ObservableCollection<Test>
{
new Test { Id = TestList.Count, Text = "test", FontSize = 20, Check = false }
});
});
bool flag = false;
SelectAll = ReactiveCommand.Create((() =>
{
if (flag == false)
{
for (int i = 0; i < TestList.Count; i++)
{
TestList[i].Check = true;
Select = true;
}
flag = true;
}
else
{
for (int i = 0; i < TestList.Count; i++)
{
TestList[i].Check = false;
Select = false;
}
flag = false;
}
}));
}
И Events:
private int id;
private void InputElement_OnPointerReleased(object? sender, PointerReleasedEventArgs e)
{
TextBox tb = sender as TextBox;
id = (int)tb.Tag;
findid.Text = id.ToString();
if (select.IsChecked == null)
{
return;
}
checksize.SelectedItem = (float)Math.Round(tb.FontSize, 1);
}
private void ToggleButton_OnIsCheckedChanged(object? sender, RoutedEventArgs e)
{
CheckBox chb = sender as CheckBox;
select.IsChecked = select.IsChecked;
}
На данном этапе работает если по менять шрифт только у одного элемента, если же я выбираю несколько элементов через чекбокс и после изменения шрифта просто нажимаю на другой элемент то подставляется шрифт который принадлежит выбранному элементу. Я думаю мне нужно привязаться как то к чекбоксу ThreeState и блокировать изменение если хоть один элемент выбран, но у меня не выходит. Шрифт выбираю через Combobox. Помогите пожалуйста.