关于WPF的绑定模式,写了一个例子:
<Grid>
<StackPanel>
<Slider x:Name="slider"
Width="Auto"
Maximum="100"
SmallChange="1" />
<StackPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="不声明模式 : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="OneWay(单向) : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=OneWay}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="TwoWay(双向) : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=TwoWay}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="OneTime(单次) : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=OneTime}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="OneWayToSource(单向到源) : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=OneWayToSource}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="Default : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=Default}" />
</WrapPanel>
</StackPanel>
</StackPanel>
</Grid>
运行以后,有一个绑定失败出来,但是没说明是哪个出问题,这个怎么看呢请问一下。
给的错误也没有说明路径
问题可能出在 OneWayToSource
模式上。OneWayToSource
模式用于将目标属性的值反向绑定到源属性,但是在您的代码中,Value
属性是 Slider
的一个依赖属性,而不是绑定到源属性。
要解决这个问题,您可以将 Value
属性绑定到一个具有可写属性的对象,然后在该对象中实现属性更改的逻辑。示例代码:
<Grid>
<Grid.Resources>
<local:SliderValueViewModel x:Key="SliderValue" />
</Grid.Resources>
<StackPanel>
<Slider x:Name="slider"
Width="Auto"
Maximum="100"
SmallChange="1" />
<StackPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="不声明模式 : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="OneWay(单向) : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=OneWay}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="TwoWay(双向) : " />
<TextBox Width="200" Text="{Binding Source={StaticResource SliderValue}, Path=Value, Mode=TwoWay}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="OneTime(单次) : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=OneTime}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="OneWayToSource(单向到源) : " />
<TextBox Width="200" Text="{Binding Source={StaticResource SliderValue}, Path=Value, Mode=OneWayToSource}" />
</WrapPanel>
<WrapPanel Margin="5">
<Label Width="Auto" Content="Default : " />
<TextBox Width="200" Text="{Binding ElementName=slider, Path=Value, Mode=Default}" />
</WrapPanel>
</StackPanel>
</StackPanel>
</Grid>
在这个示例中,我们添加了一个名为 SliderValueViewModel
的自定义视图模型,并将其作为资源添加到 Grid
中。然后,我们将 TwoWay
和 OneWayToSource
模式的绑定指向该视图模型的 Value
属性。
您需要在代码中创建一个名为 SliderValueViewModel
的类,并在其中实现 Value
属性的更改逻辑。例如:
public class SliderValueViewModel : INotifyPropertyChanged
{
private double _value;
public double Value
{
get { return _value; }
set
{
if (_value != value)
{
_value = value;
OnPropertyChanged(nameof(Value));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
这样,您就可以在 SliderValueViewModel
类中处理 Value
属性的更改,并确保绑定在 TwoWay
和 OneWayToSource
模式下工作正常。
找到问题了,是OneWayToSource得有值给slider,加上个初始值就可以了,谢谢你的回答