我正在尝试使用MultiBinding将滑块绑定到文本框(有效),并将TextBox绑定到属性(无效)。 TextBox / Property绑定可以与单绑定很好地配合,但是当我引入MultiBinding时,它会中断。
这是我的XAML
<Slider
Name="SliderExportQuality"
Value="100"
Minimum="0"
Maximum="100"
HorizontalAlignment="Left"
Margin="10,5,0,0"
VerticalAlignment="Top"
Width="239"/>
<TextBox>
<TextBox.Text>
<MultiBinding StringFormat="N2">
<Binding ElementName="SliderExportQuality" Path="Value"/>
<Binding Path="ExportQuality" UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>
</TextBox.Text>
</TextBox>
这是对话框。尝试直接在文本框中输入值后,TextBox会用红色修饰,这说明有问题吗?
我阅读了MultiBinding的一些内容,并认为我可能对Converter不太了解,但是对应该是什么却一无所知。
答案 0 :(得分:2)
就像其他人在评论中提到的那样,除非我对这个问题有误解,否则您不需要多重绑定即可完成您想做的事情。要使滑块值显示在文本框中(反之亦然),您只需要将该值绑定到视图模型中的公共属性即可。
例如,给定以下xaml:
<Grid Margin="20" VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<Slider Grid.Column="0" Minimum="0" Maximum="100" Value="{Binding FileSize}"/>
<TextBox Grid.Column="1" Text="{Binding FileSize}"/>
</Grid>
您有一个滑块,可将其值绑定到视图模型中的FileSize属性。
关联的ViewModel:
class MainWindowViewModel : INotifyPropertyChanged
{
public int FileSize
{
get
{
return mFileSize;
}
set
{
if(mFileSize != value)
{
mFileSize = value;
OnPropertyChanged(nameof(FileSize));
}
}
} private int mFileSize = 50;
private void OnPropertyChanged(String propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public event PropertyChangedEventHandler PropertyChanged;
}
这允许通过滑块或直接在文本框中键入来更改值。仍然需要在文本框上进行错误检查,因为用户可以输入任何内容...但这显示了基本概念。
这将产生以下UI。
我希望能解决您提出的问题。
答案 1 :(得分:0)
使用该绑定时,它将尝试在{上设置"75"
(注意它是string
)和ExportQuality
的值(尽管不知道其类型) {1}}属性,即Slider.Value
,由于类型错误而具有红色边框(即TextBox试图对Binding使用错误的类型,如果将TextBox绑定到int属性并键入,也会发生这种情况在“ a”中),那么您应该使用转换器double
在这种情况下,将使用FYI MultiValueConverter。
我想您想在这里使用ConvertBack();
。可以这样使用:
PriorityBinding
这样,如果第一个绑定失败,第二个绑定就会开始。