0

VisibilityタイプのViewModelプロパティをDockPanelのvisibilityプロパティにバインドしようとしています。

更新されたViewModelコード

public class SelectWaferButtonViewModel : INotifyPropertyChanged
{
    private bool isClicked;

    public SelectWaferButtonViewModel()
    {
        isClicked = false;
    }

    public bool IsControlVisible
    {
        get
        {
            return isClicked;
        }
        set
        {
            isClicked = value;
            OnPropertyChanged("IsControlVisible");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnButtonClick()
    {
        if (isClicked)
        {
            IsControlVisible = false;
        }
        else
        {
            IsControlVisible = true;
        }
    }
    protected virtual void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

これが私の更新されたXAMLコードです

            <DockPanel
                Name="tvwDockPanel"
                Width="200"
                Visibility="{Binding IsControlVisible, FallbackValue=Collapsed, Converter={StaticResource BoolToVisConverter}}"
                DockPanel.Dock="Left">
                <DockPanel
                    DockPanel.Dock="Top"
                    Height="22">
                </DockPanel>

そして、次の行でコードビハインドにデータコンテキストを設定します。

    tvwDockPanel.DataContext = btnSelectWaferViewModel;

ここで、btnSelectWaferViewModelは、この状況のViewModelオブジェクトです。

そして楽しみのために、ここに私のコードがあります

public partial class WaferTrackerWindow : Window
{
    List<ISubscribeEvents> subscriptionList;
    SelectWaferButtonViewModel btnSelectWaferViewModel;

    public WaferTrackerWindow()
    {
        InitializeComponent();

        this.InstantiateObjects();
        this.SubscribeEvents();
        this.SetDataContexts();
    }

    #region Methods

    private void SetDataContexts()
    {
        tvwDockPanel.DataContext = btnSelectWaferViewModel.IsControlVisible;
    }
    private void SubscribeEvents()
    {
        foreach (ISubscribeEvents subscriber in subscriptionList)
        {
            subscriber.SubscribeEvents();
        }
    }
    private void InstantiateObjects()
    {
        btnSelectWaferViewModel = new SelectWaferButtonViewModel();
        subscriptionList = new List<ISubscribeEvents>();
        subscriptionList.Add(
            new Classes.WaferTrackerWindow.SelectWaferButtonView(btnSelectWafer, btnSelectWaferViewModel));
    }

    #endregion
}

ボタンbtnSelectWaferをクリックし、tvwDockPanelのvisibilityプロパティを使用して、バインディングを介してVisibleに設定するだけです。次に、btnSelectWaferをもう一度クリックすると、tvwDockPanelの可視性プロパティが再び折りたたみに設定されます。tvwDockPanelの可視性は、折りたたみまたは可視のいずれかになります。

どんな助けでも素晴らしいでしょう、私はこのデータバインディング全体の概念にかなり慣れていません。

4

2 に答える 2

3

ここにはいくつかの問題があります。

まず第一に、MVVMの目的(MVVMでこれを行おうとしている場合)は、ロジックをプレゼンテーションから分離することです。これは、ViewModelが、名前空間内の他のクラスへの参照、参照System.Windows.Controls.Button、または他のクラスへの参照を持つことができないことを意味します。System.Windows.VisibilitySystem.Windows

あなたのSelectWaferButtonViewModelクラスがボタンで何をしているのか私にはわかりませんが、そこからボタンを削除する必要があります。

また、ViewModelレイヤーからコントロールの可視性を操作する必要がある場合は、XAMLでBooleanプロパティとを使用することをお勧めします。BooleanToVisibilityConverter

ViewModel:

public bool IsControlVisible {get;set;} //Don't forget INotifyPropertyChanged!!

XAML:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
</Window.Resources>
<DockPanel Visibility="{Binding IsControlVisible, Converter={StaticResource BoolToVisConverter}}"/>
于 2013-02-04T18:01:04.433 に答える
0

DockPanel問題は、ビューモデルのブールプロパティにバインドしてから、 VisiblityUI要素のIsControlVisibleプロパティをデータコンテキストのプロパティ(存在しない)に設定していることです。

への変更:

private void SetDataContexts()
{
    tvwDockPanel.DataContext = btnSelectWaferViewModel;
}
于 2013-02-04T19:16:30.953 に答える