我创建了一个用户控件来“浏览”文件,它基本上由一个文本框和一个按钮组成。
它有几个属性,允许我选择一个目录,一个现有的(打开文件对话框)或一个不存在的文件(保存文件对话框),指定过滤器,...
我正在使用这样的依赖属性:
public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register(
"FilePath",
typeof(String),
typeof(BrowseFileControl),
new PropertyMetadata(default(String), InvokeFilePathChanged)
);
public String FilePath { get { return (String)GetValue(FilePathProperty); } set { SetValue(FilePathProperty, value); } }
private static void InvokeFilePathChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
{
BrowseFileControl view = (BrowseFileControl)property;
view.InvokeFilePathChanged((String)args.OldValue, (String)args.NewValue);
}
protected virtual void InvokeFilePathChanged(String oldValue, String newValue)
{
InvokePropertyChanged("FilePath");
}
在我看来,我有一个列表框,允许我选择要编辑的“配置”,并且我的所有字段(包括我的用户控件)都绑定(bind)到 CurrentConfiguration(并且 CurrentConfiguration 绑定(bind)到 SelectedItem)。
我的问题: 第一次加载总是没问题,但如果我选择另一个配置,它就不会更新并保留旧文本。
我的绑定(bind)是这样的:
<userContols:BrowseFileControl Grid.Row="4" Grid.Column="1"
Margin="2" FilePath="{Binding CurrentConfiguration.TagListFile,
ValidatesOnDataErrors=true, NotifyOnValidationError=true}"
IsFolder="False" Filter="All files (*.*)|*.*" CanBeInexistantFile="False"/>
如果我使用具有完全相同绑定(bind)的简单文本框,它会正确更新!
<TextBox Grid.Row="4" Grid.Column="1"
Text="{Binding CurrentConfiguration.TagListFile,ValidatesOnDataErrors=true, NotifyOnValidationError=true}"
Margin="2"/>
我在 visual studio 的输出窗口中也没有看到任何绑定(bind)错误。
那么我的绑定(bind)有什么问题呢?
编辑:UserControl 的 xaml:
<Grid DataContext="{Binding ElementName=uxBrowseFileControl}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Padding="2" Text="{Binding FilePath, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>
<Button Content="Browse" Grid.Column="1" Padding="2" Command="{Binding BrowseCommand}"/>
</Grid>
uxBrowseFileControl 是 <UserControl>
的名称
编辑 2:事实上,如果我通过 userControl 更改某些内容,它也不会复制到模型中:/
Edit3: 我将“Mode=TwoWay”放入 currentItem.FilePath->UserControl 的绑定(bind)中,现在它似乎可以工作,但为什么呢?具有相同绑定(bind)的 TextBox 正在运行!
最佳答案
您应该删除 DependencyProperty 的更改回调。您不需要任何特殊逻辑来使依赖属性在更改时更新 UI - 这已经内置到依赖属性中。
这就是你所需要的:
public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register(
"FilePath",
typeof(String),
typeof(BrowseFileControl),
new PropertyMetadata(default(String))
);
public String FilePath { get { return (String)GetValue(FilePathProperty); } set { SetValue(FilePathProperty, value); } }
您可能还想将依赖属性设置为默认绑定(bind) TwoWay
,(TextBox
控件的 Text
属性也执行此操作):
public static readonly DependencyProperty FilePathProperty = DependencyProperty.Register(
"FilePath",
typeof(String),
typeof(BrowseFileControl),
new FrameworkPropertyMetadata(default(String), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
这样您就不必在绑定(bind)该属性时显式设置 Mode=TwoWay
。
关于WPF:绑定(bind)到我的自定义控件不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13622815/