#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}" />