Есть один TextBox для ввода текста и дальнейшего его сжатия
<TextBox Grid.Row="0" Grid.ColumnSpan="4" AcceptsReturn="True"
SpellCheck.IsEnabled="True" Language="ru-ru"
VerticalScrollBarVisibility ="Auto" Text="{Binding Path=MainText, UpdateSourceTrigger=PropertyChanged}"
FontSize="14" Margin="5,5,5,5" Grid.RowSpan="1"/>
При попытке изменить содержимое через функции Открыть после которой ты выбираешь файл с текстом содержимое TextBox не меняется.
Вот само свойство
private string _MainText = "empty";
public string MainText
{
get => _MainText;
set => Set(ref _MainText, value);
}
Метод Set из классаPropertyChangeding
public class PropertyChangeding : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string prop = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
protected virtual bool Set<T>(ref T fules, T value, [CallerMemberName] string prop = "")
{
if (object.Equals(fules, value)) return false;
fules = value;
OnPropertyChanged(prop);
return true;
}
}
Команда для открытия
public ICommand OpenNewFileCommand { get; }
private bool CanOpenNewFileCommandExecute(object p) => true;
private void OnOpenNewFileCommandExecited(object p)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "Text documents (*.txt)|*.txt|All files (*.*)|*.*";
dialog.FilterIndex = 2;
Nullable<bool> result = dialog.ShowDialog();
if (result == true)
{
// Open document
string text = File.ReadAllText(dialog.FileName);
MainText = text;
}
}
Весь XAML код
<Window x:Class="Course_work_IT.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:view="clr-namespace:Course_work_IT.ViewModels"
mc:Ignorable="d"
Title="MainWindow" Height="500" Width="900">
<Window.DataContext>
<view:BaseVeiwModel/>
</Window.DataContext>
<Window.InputBindings>
<KeyBinding Modifiers="Ctrl" Key="X" Command="{Binding CloseApplicationCommand}"/>
</Window.InputBindings>
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<materialDesign:BundledTheme BaseTheme="Light" PrimaryColor="Purple" SecondaryColor="Lime" />
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<DockPanel>
<Menu DockPanel.Dock="Top" FontSize="13" Height="38" VerticalAlignment="Center" >
<Menu.DataContext>
<view:PersonTextViewModel/>
</Menu.DataContext>
<MenuItem Header="File">
<MenuItem Header="Открыть" Command="{Binding Path=OpenNewFileCommand}"/>
<MenuItem Header="Exit" Command="{Binding CloseApplicationCommand}"/>
<MenuItem Header="Run" Command="{Binding Path=ChangeProgressBarCommand}"/>
</MenuItem>
<MenuItem Header="About">
<MenuItem Header="Info"/>
</MenuItem>
<MenuItem Header="{Binding Path=MainText, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox Text="{Binding Path=MainText, UpdateSourceTrigger=PropertyChanged}"/>
<MenuItem Header="Назад" Command="{Binding Path=ChangeSelectedItemCommand}" CommandParameter="-1"/>
<MenuItem Header="Вперед" Command="{Binding Path=ChangeSelectedItemCommand}" CommandParameter="+1"/>
</Menu>
<StatusBar DockPanel.Dock="Bottom">
<StatusBarItem>
<TextBlock Text="{Binding Path=ProcessProgressbar, UpdateSourceTrigger=LostFocus}" MinHeight="15" MinWidth="50"/>
</StatusBarItem>
<StatusBarItem>
<ProgressBar Width="120" Height="14" Value="{Binding Path=ProgressBarValue, UpdateSourceTrigger=PropertyChanged, Mode = OneWay}">
</ProgressBar>
</StatusBarItem>
</StatusBar>
<TabControl SelectedIndex="{Binding Path=SelectedItem}" FontFamily="Lucida Sans">
<TabItem Header="Кодирование">
<Grid HorizontalAlignment="Stretch">
<Grid.DataContext>
<view:PersonTextViewModel/>
</Grid.DataContext>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="381*"/>
<ColumnDefinition Width="259*"/>
<ColumnDefinition Width="56*"/>
<ColumnDefinition Width="104*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="0.825*"/>
<RowDefinition Height="0.175*"/>
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Grid.ColumnSpan="4" Grid.RowSpan="1" Text="{Binding Path=MainText}"/>
<Grid Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock
Text="Алгоритм сжатия :"
Grid.Column="0"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="10, 0, 0, 0"/>
<ComboBox Grid.Column="0"
HorizontalAlignment="Center"
Margin="90, 0, 0, 0"
SelectedItem="{Binding Path=Algorithm}"
ItemsSource="{Binding Path=_algorithms}"
Width="50">
</ComboBox>
<StackPanel Grid.Column="1" Orientation="Horizontal">
<TextBlock
HorizontalAlignment="Left"
Text="Название файла :"
Grid.Column="1"
VerticalAlignment="Center"
Margin="10, 0, 20, 0"/>
<TextBox
Text="{Binding Path=FileName}"
Grid.Column="1"
VerticalAlignment="Center"
HorizontalAlignment="Right"
Margin="0, 0, 0, 0"/>
</StackPanel>
<TextBlock
Text="Степень сжатия :"
Grid.Column="2"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Margin="10, 0, 0, 0"/>
<ComboBox Grid.Column="2"
HorizontalAlignment="Center"
Margin="110, 0, 0, 0"
SelectedItem="{Binding Path=Comprassion}"
ItemsSource="{Binding Path=_comprassions}"
Width="100">
</ComboBox>
</Grid>
<StackPanel Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="2" Orientation="Vertical">
<Label Content="Текст должен быть больше 200 символов" Margin="0,0,0,0" FontSize="6" HorizontalContentAlignment="Center" />
<Button Command="{Binding Path=SaveNewFileCommand}" CommandParameter="true"
HorizontalAlignment="Left" Margin="34,0,0,13"
Cursor="Hand" FontSize="20">
<TextBlock Text="сжать" FontSize="20" Margin="0,-4,0,0" FontFamily="Bodoni MT Black"/>
</Button>
</StackPanel>
</Grid>
</TabItem>
<TabItem Header="Декодирование">
<Grid></Grid>
</TabItem>
</TabControl>
</DockPanel>
Menuполя, которые я забиндил к свойству MainText (то же свойство и уTextbox), эти поля взаимосвязанны и прекрасно текст в них меняется, но в самомTextBox, почему то вначале текст привязывается, а после он не обновляется – Oct 10 '22 at 09:35<Window.DataContext>- плохо, забудьте про это. Это кстати наверно и ваша проблема с обновление, ибо у вас в XAML задан один экземпляр VM класса, а в коде небось пишетеvar vm = new BaseVeiwModel(); vm.MainText = "....";, что означает "Создать новый экземпляр класса и в нем поменять значение свойства". Другими словами, у вас два объектаBaseVeiwModelсо своими значениями, где один привязан к UI, а другой используется в коде. – EvgeniyZ Oct 10 '22 at 14:51