首页 新闻 会员 周边

WPF绑定失败

0
悬赏园豆:10 [已解决问题] 解决于 2023-06-14 16:14

关于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>

运行以后,有一个绑定失败出来,但是没说明是哪个出问题,这个怎么看呢请问一下。

给的错误也没有说明路径

MonoiF的主页 MonoiF | 菜鸟二级 | 园豆:266
提问于:2023-06-14 14:28
< >
分享
最佳答案
0

问题可能出在 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 中。然后,我们将 TwoWayOneWayToSource 模式的绑定指向该视图模型的 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 属性的更改,并确保绑定在 TwoWayOneWayToSource 模式下工作正常。

收获园豆:10
lanedm | 老鸟四级 |园豆:2381 | 2023-06-14 14:39

找到问题了,是OneWayToSource得有值给slider,加上个初始值就可以了,谢谢你的回答

MonoiF | 园豆:266 (菜鸟二级) | 2023-06-14 16:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册