gpt4 book ai didi

c# - 如何通过 ViewModel 控制 View VisualState

转载 作者:行者123 更新时间:2023-12-03 10:27:37 26 4
gpt4 key购买 nike

问题是:如何获取/设置 VisualStateControl (具有两个以上的视觉状态)在 View 上通过我的 ViewModel在 MVVM 模式中(带有零 View 代码隐藏)?

我见过类似的问题,他们的回答对我不起作用:

  • Binding [VisualStateManager] view state to a MVVM viewmodel?
  • How to change VisualState via ViewModel

  • 注:下面我将解释上述问题中的答案有什么问题。如果您知道更好的方法,则可以忽略阅读此问题的其余部分。

    至于第一个问题, accepted answer的方法对我不起作用。一旦我输入提到的 XAML 代码
    <Window .. xmlns:local="clr-namespace:mynamespace" ..>
    <TextBox Text="{Binding Path=Name, Mode=TwoWay}"
    local:StateHelper.State="{Binding Path=State, Mode=TwoWay}" />
    </Window>

    它显示了一个设计时错误: The attachable property 'State' was not found in type 'StateHelper'. ,我试图通过重命名 StateHelper.StateProperty 来克服这个问题至 StateHelper.State , 最终出现两个错误..
    1: The attachable property 'State' was not found in type 'StateHelper'.
    2: The local property "State" can only be applied to types that are derived from "StateHelper".
    至于第二个问题, accepted answer的方法对我不起作用。修复后 VisualStateSettingBehavior的语法错误为:
    public class VisualStateSettingBehavior : Behavior<Control>
    {

    private string sts;
    public string StateToSet
    {
    get { return sts; }
    set
    {
    sts = value;
    LoadState();
    }
    }

    void LoadState()
    {
    VisualStateManager.GoToState(AssociatedObject, sts, false);
    }
    }

    我在线上遇到了设计时错误
        <local:VisualStateSettingBehavior StateToSet="{Binding State}"/>

    上面写着: A 'Binding' cannot be set on the 'StateToSet' property of type 'VisualStateSettingBehavior'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
    我试图通过制作 VisualStateSettingBehavior.StateToSet 来合并这两个解决方案一个依赖属性,但我在 View 中遇到了其他设计时错误.

    有什么建议?

    最佳答案

    最后,我可以解决这个问题。解决方法与 first question's best answer 类似.我发现就我而言,View.xaml 有一些限制。使用附加属性:

  • 它必须通过 DependencyProperty.RegisterAttached 注册.
  • 必须是 静态 .
  • 它必须有一个属性实例(getter/setter)。

  • 我通过 this 解决了这个问题考虑到编码风格,最后的方法是:

    VisualStateApplier :
    public class VisualStateApplier
    {

    public static string GetVisualState(DependencyObject target)
    {
    return target.GetValue(VisualStateProperty) as string;
    }
    public static void SetVisualState(DependencyObject target, string value)
    {
    target.SetValue(VisualStateProperty, value);
    }

    public static readonly DependencyProperty VisualStateProperty =
    DependencyProperty.RegisterAttached("VisualState", typeof(string), typeof(VisualStateApplier), new PropertyMetadata(VisualStatePropertyChangedCallback));

    private static void VisualStatePropertyChangedCallback(DependencyObject target, DependencyPropertyChangedEventArgs args)
    {
    VisualStateManager.GoToElementState((FrameworkElement)target, args.NewValue as string, true); // <- for UIElements, OR:
    //VisualStateManager.GoToState((FrameworkElement)target, args.NewValue as string, true); // <- for Controls
    }
    }

    查看 :
    <!--A property inside the object that owns the states.-->
    <local:VisualStateApplier.VisualState>
    <Binding Path="State"/>
    </local:VisualStateApplier.VisualState>

    View 模型 :
    private string _state;
    public string State
    {
    get { return _state; }
    set
    {
    _state = value;
    RaisePropertyChanged("State");
    }
    }

    关于c# - 如何通过 ViewModel 控制 View VisualState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32811867/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com