Текстовое поле WPF и просмотр файла — есть ли более элегантное решение?

#c# #wpf #data-binding #openfiledialog

#c# #wpf #привязка данных #openfiledialog

Вопрос:

у меня есть простой сценарий диалогового окна textbox file. текстовое поле привязано к объекту в colooection. я хочу выбрать файл и заполнить им текстовое поле, которое, в свою очередь, обновит свойство связанного объекта. удалось получить имя файла в текстовое поле, но затем привязка текстового поля не сработала, потому что она не обнаружила изменений. мне пришлось добавить изменение focus (), чтобы запустить обновление. есть ли лучший способ?

 <TextBox Text="{Binding Path=FlexString1,Mode=TwoWay}" 
         Height="23" 
         HorizontalAlignment="Left" 
         Margin="10" Name="textPath" 
         VerticalAlignment="Top" 
         Width="236" />
<Button Height="25" 
        HorizontalAlignment="Left" 
        Margin="0" 
        Name="btnBrowseFile" 
        Padding="1" VerticalAlignment="Top" 
        Width="45" Click="btnBrowseFile_Click">
  <TextBlock FontSize="10" 
             FontWeight="Normal" 
             Foreground="#FF3C3C3C" 
             Text="Browse" 
             TextWrapping="Wrap" />
</Button>

private void btnBrowseFile_Click(object sender, RoutedEventArgs e)
{
    // Configure open file dialog box
    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
    //dlg.FileName = "Document"; // Default file name
    //dlg.DefaultExt = ".txt"; // Default file extension
    //dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension

    // Show open file dialog box
    Nullable<bool> result = dlg.ShowDialog();

    // Process open file dialog box results
    if (result == true)
    {
        // Open document
        TextBox path = (TextBox)(((FrameworkElement)sender).Parent as FrameworkElement).FindName("textPath");
        path.Text = dlg.FileName;
        path.Focus(); //these 2 lines force the binding to trigger
        ((Button)sender).Focus();
    }
}   
 

Ответ №1:

Просто установите свойство view model FlexString1 напрямую.

Привязка гарантирует, что пользовательский интерфейс обновляется правильно.

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

Ответ №2:

Обновление текстового поля по умолчанию находится на LostFocus. Попробуйте вместо этого изменить его на PropertyChanged:

 <TextBox Text="{Binding Path=FlexString1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />