Slider 和 TextBox 的 WPF MulitBinding 未更新 属性
WPF MulitBinding of Slider and TextBox not updating property
我正在尝试使用 MultiBinding 将滑块绑定到文本框(有效)并将文本框绑定到 属性(无效)。 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 可能出了问题,但我不知道它应该是什么。
正如其他人在评论中提到的那样,除非我误解了这个问题,否则您不需要多重绑定来完成您想要做的事情。要使滑块值显示在文本框中(反之亦然),您只需将该值绑定到视图模型中的公共 属性。
例如,给定以下 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。
我希望这能解决您提出的问题。
当你使用那个 Binding 时,它会尝试设置 "75"
(注意它是 string
)和 ExportQuality
的值(尽管不知道它的类型) Slider.Value
属性,即 double
,它有红色边框,因为类型错误(即 TextBox 试图使用不正确的类型进行绑定,如果您将 TextBox 绑定到一个 int 属性 然后你输入 "a"),如果你使用一个转换器,那么它会 ConvertBack();
FYI MultiValueConverter would be used in this case.
我想你想在这里使用的是 PriorityBinding
。可以这样使用:
<TextBox>
<TextBox.Text>
<PriorityBinding>
<Binding ElementName="SliderExportQuality" Path="Value"/>
<Binding Path="ExportQuality" UpdateSourceTrigger="PropertyChanged"/>
</PriorityBinding>
</TextBox.Text>
</TextBox>
这样,如果第一个绑定失败,第二个绑定将生效。
我正在尝试使用 MultiBinding 将滑块绑定到文本框(有效)并将文本框绑定到 属性(无效)。 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 可能出了问题,但我不知道它应该是什么。
正如其他人在评论中提到的那样,除非我误解了这个问题,否则您不需要多重绑定来完成您想要做的事情。要使滑块值显示在文本框中(反之亦然),您只需将该值绑定到视图模型中的公共 属性。
例如,给定以下 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。
我希望这能解决您提出的问题。
当你使用那个 Binding 时,它会尝试设置 "75"
(注意它是 string
)和 ExportQuality
的值(尽管不知道它的类型) Slider.Value
属性,即 double
,它有红色边框,因为类型错误(即 TextBox 试图使用不正确的类型进行绑定,如果您将 TextBox 绑定到一个 int 属性 然后你输入 "a"),如果你使用一个转换器,那么它会 ConvertBack();
FYI MultiValueConverter would be used in this case.
我想你想在这里使用的是 PriorityBinding
。可以这样使用:
<TextBox>
<TextBox.Text>
<PriorityBinding>
<Binding ElementName="SliderExportQuality" Path="Value"/>
<Binding Path="ExportQuality" UpdateSourceTrigger="PropertyChanged"/>
</PriorityBinding>
</TextBox.Text>
</TextBox>
这样,如果第一个绑定失败,第二个绑定将生效。