Я создал небольшой Control Browser File:Проблема с DependencyProperty связывания
<UserControl x:Class="Test.UserControls.FileBrowserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="44" d:DesignWidth="461" Name="Control">
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Margin="3" Text="{Binding SelectedFile}" IsReadOnly="True" TextWrapping="Wrap" />
<Button HorizontalAlignment="Right" Margin="3" Width="100" Content="Browse" Grid.Column="1" Command="{Binding BrowseCommand}" />
</Grid>
</UserControl>
С помощью следующего кода позади:
public partial class FileBrowserControl : UserControl
{
public ICommand BrowseCommand { get; set; }
//The dependency property
public static DependencyProperty SelectedFileProperty = DependencyProperty.Register("SelectedFile",
typeof(string),typeof(FileBrowserControl), new PropertyMetadata(String.Empty));
public string SelectedFile { get{ return (string)GetValue(SelectedFileProperty);} set{ SetValue(SelectedFileProperty, value);}}
//For my first test, this is a static string
public string Filter { get; set; }
public FileBrowserControl()
{
InitializeComponent();
BrowseCommand = new RelayCommand(Browse);
Control.DataContext = this;
}
private void Browse()
{
SaveFileDialog dialog = new SaveFileDialog();
if (Filter != null)
{
dialog.Filter = Filter;
}
if (dialog.ShowDialog() == true)
{
SelectedFile = dialog.FileName;
}
}
}
И я использую это так:
<userControls:FileBrowserControl SelectedFile="{Binding SelectedFile}" Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*"/>
(SelectedFile - свойство ViewModel пользовательского контроля с использованием этого элемента управления)
В настоящее время проблема заключается в том, что когда я нажимаю «Обзор», текстовое поле в usercontrol корректно обновляется, но свойство SelectedFile родительского элемента viewmodel не задано (нет вызова установленного свойства).
Если установить режим связывания с TwoWay, я получил это исключение:
An unhandled exception of type 'System.StackOverflowException' occurred in Unknown Module.
Так что я сделал не так?
Кажется, что намного лучше, спасибо. Вы, кажется, очень хорошо знаете хорошие практики. У меня есть небольшой другой вопрос: в настоящее время этот userControl имеет всю свою логику в коде. это распространено? Потому что это не очень уважает архитектуру MVVM, которую я пытаюсь выполнить. – J4N
UserControl обычно имеет всю свою логику в своем коде, по крайней мере те части логики, которые связаны с просмотром. Однако его код не должен (сильно) модифицировать его модель представления. – Clemens
Хорошо, но, допустим, у меня есть фильтр, InitialDirectory, SelectedFile, ... не могу ли я связать это с ViewModel, который содержит эти поля? – J4N