WPF обновить текстовый блок из другого окна - PullRequest
0 голосов
/ 08 марта 2019

У меня есть окно с именем RolledPaper.xaml с текстовым блоком с именем SequenceValue.SequenceValue определяется в другом окне с именем CounterSettings.xaml, вводя текстовое поле с именем SequenceRequested.Я хотел бы, чтобы SequenceValue всегда был в согласии с SequenceRequested.Я попытался и потерпел неудачу, используя один и тот же текст данных для обоих окон.вот код RolledPaper.xaml:

<Window x:Class="Numbering3.View.RolledPaper"
            WindowStyle="None"
    ResizeMode="NoResize"
    BorderBrush="LightGray"
    BorderThickness="5"
    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:local="clr-namespace:Numbering3.View"
    xmlns:vm="clr-namespace:Numbering3.ViewModel"
    xmlns:cv="clr-namespace:Numbering3.Helper"
    xmlns:vo="clr-namespace:Numbering3.ViewModel"
     xmlns:sys="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d"
    Title="RolledPaper"  Height="750" Width="1218"
    Background="{DynamicResource WindowBrush}"
    DataContextChanged="Rolledpaper_DataContextChanged">
<Window.DataContext>
    <vm:ViewModelRolledPaper/>
</Window.DataContext>


 <TextBlock x:Name="SequenceValue" Grid.Column="3" HorizontalAlignment="Left" Height="19" Margin="72,310,0,0" TextWrapping="Wrap" 
               Background="White" VerticalAlignment="Top" Width="98" Text="{Binding _SequenceValueToShow.SequenceValuetoShow, Mode=TwoWay, FallbackValue=NNN, TargetNullValue=NNN, UpdateSourceTrigger=PropertyChanged}"/>


</Grid>

код позади:

    public partial class RolledPaper : Window
{
    public RolledPaper()
    {
        WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
        SaveKeeper.fromMain = false;
        InitializeComponent();
        this.MouseLeftButtonDown += delegate { this.DragMove(); };
        DataContextChanged += new DependencyPropertyChangedEventHandler(Rolledpaper_DataContextChanged);
    }

окно CounterSetting:

<Window x:Class="Numbering3.View.CounterSettings"

... ...

    <Window.DataContext>
    <ViewModelCounterSettings/>
</Window.DataContext>
    <Grid Margin="0,-19,-0.4,0">
<TextBox  x:Name="SequenceRequested"  PreviewTextInput="SequenceValidationTextBox" MaxLength="10" HorizontalAlignment="Left" Height="23" Margin="154,324,0,0" TextWrapping="Wrap" 
              Text="{Binding Path=_SequenceValueToShow.SequenceValueToKeep,   FallbackValue='NNN', TargetNullValue ='NNN', Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }"  VerticalAlignment="Top" Width="120" TextChanged="SequenceRequested_TextChanged" />
    </Grid>

его код:

 public partial class CounterSettings : Window
{
    public CounterSettings()
    {
        InitializeComponent();
        this.MouseLeftButtonDown += delegate { this.DragMove(); };

        DataContextChanged += new DependencyPropertyChangedEventHandler(CounterSettings_DataContextChanged);

    }

И класс SequeneValue:

   public class SequenceValue : INotifyPropertyChanged
{
        public string SequenceValueToKeep
    {
        get
        {
            return _sequenceValueToKeep=_sequenceProcessor.GetSequence();
        }

        set
        {
            if (_sequenceValueToKeep != value)
            {
                __sequenceValueToKeep = value;
                RaisePropertyChanged("SequenceValueToKeep");
            }
        }
    }
        private void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null)
        { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
}

Мне нужнопоместить значение в текстовое поле countersetting => string Sequencevalue.SequenceValueToKeep обновляется => текстовый блок в окне RolledPaper показывает Sequencevalue.SequenceValueToKeep.

Спасибо.

1 Ответ

0 голосов
/ 11 марта 2019

Solutio 1:

Вы можете использовать одну статическую модель представления, чтобы узнать друг друга.

в App.xaml

<Application.Resources>
    ...
    <MainViewModel x:Key="mainViewModel" />
</Application.Resources>

, а затем в CounterSetting.xaml

<Window otherProperties=...
        DataContext="{Binding ViewModelCounterSettings, Source={StaticResource mainViewModel}}"/>

и в RolledPaper.xaml

<Window otherProperties=...
        DataContext="{Binding ViewModelRolledPaper, Source={StaticResource mainViewModel}}"/>

MainViewModel устанавливает в два ваших ViewModel и делает их доступными как свойства, а также дает тот же экземпляр SequenceValue

Решение 2:

Создайте объект SequenceValue в качестве статического ресурса, например

<Application.Resources>
    ...
    <SequenceValue x:Key="sequenceValue"/>
</Application.Resources>

, и установите его в качестве DataContext вашего TextBox и TextBlock

<TextBox DataContext="{StaticResource sequenceValue}" 
         Text="{Binding SequenceValueToKeep, FallbackValue='NNN', TargetNullValue='NNN', Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }"
        ... />

<TextBlock DataContext="{StaticResource sequenceValue}" 
           Text="{Binding SequenceValuetoShow, FallbackValue=NNN, TargetNullValue=NNN, UpdateSourceTrigger=PropertyChanged}"
...