Свяжите свойство text нескольких TextBoxes, используя только одну переменную и одно событие в MainWindow - PullRequest
0 голосов
/ 17 октября 2018

Я хочу использовать событие SelectFile одной кнопки Select и привязку outputFolderPath, чтобы установить значение для нескольких TextBox в приложении WPF.Как я могу это сделать?

Вот код на MainWindow.xaml:

                    <StackPanel Grid.Column="0" Margin="10 10 0 0">
                        <TextBlock Margin="5 0 0 5" Text="First File:" FontWeight="Bold"/>
                        <TextBox Margin="0 0 0 5" Padding="2" x:Name="firstFilePath" Text="{Binding outputFolderPath}"/>

                        <TextBlock Margin="5 0 0 5" Text="Second File:" FontWeight="Bold"/>
                        <TextBox Margin="0 0 0 5" Padding="2" x:Name="secondfilePath" Text="{Binding outputFolderPath}"/>
                    </StackPanel>

                    <StackPanel Grid.Column="1" Margin="10 30 0 0">
                        <Button Margin="0 0 0 0" Content="Select" HorizontalAlignment="Left" Height="25" VerticalAlignment="Top" Width="80" Click="SelectFile"/>
                        <Button Margin="0 23 0 0" Content="Select" HorizontalAlignment="Left" Height="25" VerticalAlignment="Top" Width="80" Click="SelectFile"/>
                    </StackPanel>

А этот на MainWindow.xaml.xs:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public string outputFolderPath { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void SelectFile(object sender, RoutedEventArgs e)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();

        if (openFileDialog.ShowDialog().Value)
        {
            outputFolderPath = openFileDialog.FileName;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(outputFolderPath)));
        }
    }
}

Приложение WPF выглядит так: [enter image description here

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

В целях стилизации и создания шаблонов я бы порекомендовал вам предоставить два свойства зависимостей, с которыми вы затем можете связать свои TextBox es.

В вашем классе MainWindow C # определите следующую только для чтениясвойства зависимостей:

#region FirstFile dependency property

public string FirstFile 
{
    get => (string)GetValue(FirstFileProperty);
    private set => SetValue(FirstFilePropertyKey, value);
}

private static readonly DependencyPropertyKey FirstFilePropertyKey = 
    DependencyProperty.RegisterReadOnly(nameof(FirstFile), 
        typeof(string), typeof(MainWindow));

public static readonly DependencyProperty FirstFileProperty = 
    FirstFilePropertyKey.DependencyProperty;

#endregion

#region SecondFile dependency property

public string SecondFile 
{
    get => (string)GetValue(SecondFileProperty);
    private set => SetValue(SecondFilePropertyKey, value);
}

private static readonly DependencyPropertyKey SecondFilePropertyKey = 
    DependencyProperty.RegisterReadOnly(nameof(SecondFile), 
        typeof(string), typeof(MainWindow));

public static readonly DependencyProperty SecondFileProperty = 
    SecondFilePropertyKey.DependencyProperty;

#endregion

Теперь привяжите свои текстовые поля к этим свойствам зависимостей, как показано ниже:

<TextBox Margin="0 0 0 5" Padding="2" x:Name="firstFilePath" Text="{Binding FirstFile}"/>
<TextBox Margin="0 0 0 5" Padding="2" x:Name="secondfilePath" Text="{Binding SecondFile}"/>

Свойства зависимостей обеспечивают необходимые механизмы уведомлений для WPF, которые облегчают нашу работу,Они предпочтительны для обязательных сценариев, когда это возможно.

0 голосов
/ 17 октября 2018

Реализуйте интерфейс INotifyPropertyChanged, как показано ниже, и используйте событие для уведомления об изменении свойства.

Вам нужно иметь два свойства, чтобы содержать два разных значения.

Пример кода -

  public partial class MainWindow : Window, INotifyPropertyChanged
  {

    private string outputFolderPath;
    public string OutputFolderPath
    {
        get { return outputFolderPath; }
        set
        {
            outputFolderPath = value;
            OnPropertyChanged("OutputFolderPath");
        }
    }

    private string secondOutputFolderPath;
    public string SecondOutputFolderPath
    {
        get { return secondOutputFolderPath; }
        set
        {
            secondOutputFolderPath= value;
            OnPropertyChanged("SecondOutputFolderPath");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...