1

これは皆さんにとっては簡単かもしれませんが、WPF を始めたばかりで、常に Winforms の観点から考えており、常に間違っています。

とにかくここに私の状況があります。私は以下のように私のビューにラベルを持っています:

UserControl

 <UserControl.Resources>

    <Converters:BooleanToVisibilityConverter x:Key="visibilityConverter"></Converters:BooleanToVisibilityConverter>

    <!-- Error Handling -->
    <Converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />

    <Converters:ErrorConverter x:Key="errorConverter"/>
    <ControlTemplate x:Key="ErrorTemplate">
        <Border BorderBrush="Red" BorderThickness="2">
            <AdornedElementPlaceholder />
        </Border>
    </ControlTemplate>
    <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors), Converter={StaticResource errorConverter}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style x:Key="comboBoxInError" TargetType="{x:Type ComboBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors), Converter={StaticResource errorConverter}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>

ラベル

<Label Name="IsImageValid"  Content="Image Created" Margin="0,7,-1,0" Style="{StaticResource LabelField}"
                    Grid.ColumnSpan="2" Grid.Row="15" Width="90" Height="28" Grid.RowSpan="2"
                    Grid.Column="1" IsEnabled="True" 
                    Visibility="{Binding IsImageValid,Converter={StaticResource BooleanToVisibilityConverter}}" />

ビューモデルで this ラベルを呼び出そうとしていますが、方法がわかりません。

以下のような条件に基づいて、ラベルを使用してメッセージを表示する予定です。

  ViewModel

 public class MetadataViewModel : NotificationObject, IMetadataViewModel
{
    #region :: Properties ::

    private IEventAggregator eventAggregator;
    private IImageResizerService imageResizer;

    private string headerInfo;
    public string HeaderInfo
    {
        get
        {
            return headerInfo;
        }
        set
        {
            if (this.headerInfo != value)
            {
                this.headerInfo = value;
                this.RaisePropertyChanged(() => this.HeaderInfo);
            }
        }
    }

    public ICommand SaveCommand
    {
        get;
        private set;
    }

    public ICommand CloseCommand
    {
        get;
        private set;
    }

    public ICommand DeleteCommand
    {
        get;
        private set;
    }

    public ICommand SubmitCommand
    {
        get;
        private set;
    }

    public ICommand UnSubmitCommand
    {
        get;
        private set;
    }

    public ICommand LocationSearchCommand
    {
        get;
        private set;
    }

    public ICommand SubjectSearchCommand
    {
        get;
        private set;
    }

    public ICommand RemoveLocationCommand
    {
        get;
        private set;
    }

    public ICommand RemoveSubjectCommand
    {
        get;
        private set;
    }

    private StoryItem selectedStory;
    public StoryItem SelectedStory
    {
        get
        {
            return this.selectedStory;
        }
        set
        {
            if (this.selectedStory != value)
            {
                this.selectedStory = value;
                this.RaisePropertyChanged(() => this.SelectedStory);

                // raise dependencies
                this.RaisePropertyChanged(() => this.CanSave);
                this.RaisePropertyChanged(() => this.CanUnSubmit);
                this.RaisePropertyChanged(() => this.CanDelete);

            }
        }
    }


    public List<Program> ProgramList 
    { 
        get; 
        private set; 
    }

    public List<Genre> GenreList 
    { 
        get; 
        private set; 
    }

    public List<Copyright> CopyrightList 
    { 
        get; 
        private set; 
    }

    public bool CanSave
    {
        get
        {
            bool canSave = false;

            if (this.SelectedStory.IsLockAvailable)
            {
                if (!this.SelectedStory.Submitted)
                {
                    canSave = true;
                }
            }

            return canSave;
        }
    }

    public bool CanDelete
    {
        get
        {
            bool canDelete = false;

            if (this.SelectedStory.IsLockAvailable)
            {
                if (!this.SelectedStory.Submitted)
                {
                    canDelete = true;
                }
            }

            return canDelete;
        }
    }



    public bool CanUnSubmit
    {
        get
        {
            bool canUnSubmit = false;

            if (this.SelectedStory.IsLockAvailable)
            {
                if (this.SelectedStory.Submitted)
                {
                    canUnSubmit = true;
                }
            }

            return canUnSubmit;
        }
    }

    #endregion

    #region :: Contructor ::

    [ImportingConstructor]
    public MetadataViewModel(
            IMetadataController metadataController, 
            IGatewayService gateway, 
            INavigationService navigator,
            IImageResizerService imageResizer,
            IEventAggregator eventAggregator
        )
    {
        this.eventAggregator = eventAggregator;
        this.imageResizer = imageResizer;

        // populate drop-down lists
        this.ProgramList = gateway.GetPrograms(true);
        this.GenreList = gateway.GetGenres();
        this.CopyrightList = gateway.GetCopyrights();

        // add dummy values so the user can de-select
        this.ProgramList.Add(new Program());
        this.GenreList.Add(new Genre());
        this.CopyrightList.Add(new Copyright());

        // commands
        this.SaveCommand = metadataController.SaveCommand;
        this.CloseCommand = metadataController.CloseCommand;
        this.DeleteCommand = metadataController.DeleteCommand;
        this.SubmitCommand = metadataController.SubmitCommand;
        this.UnSubmitCommand = metadataController.UnSubmitCommand;



        this.LocationSearchCommand = new DelegateCommand<string>(this.LocationSearch);
        this.SubjectSearchCommand = new DelegateCommand<string>(this.SubjectSearch);
        this.RemoveLocationCommand = new DelegateCommand<Topic>(this.RemoveLocation);
        this.RemoveSubjectCommand = new DelegateCommand<Topic>(this.RemoveSubject);

        // events
        this.eventAggregator.GetEvent<StorySelectedEvent>().Subscribe(OnStorySelected, ThreadOption.UIThread);
        this.eventAggregator.GetEvent<AddLocationEvent>().Subscribe(OnAddLocation, ThreadOption.UIThread);
        this.eventAggregator.GetEvent<AddSubjectEvent>().Subscribe(OnAddSubject, ThreadOption.UIThread);
        this.eventAggregator.GetEvent<CommandCompletedEvent>().Subscribe(OnCommandCompleted, ThreadOption.UIThread);
        this.eventAggregator.GetEvent<ImageResizeCompletedEvent>().Subscribe(OnImageResizeCompleted, ThreadOption.UIThread);

        this.Initialize();
    }

    #endregion

    private void OnStorySelected(StoryItem selectedStory)
    {
        if (this.selectedStory != null)
        {
            this.Initialize();

            // override the initialized values
            this.SelectedStory = selectedStory;
            this.SelectedStory.HaveChanged = false;
            this.HeaderInfo = "Edit";
        }
    }

    public void OnAddLocation(Topic topic)
    {
        if (topic != null)
        {
            if (!this.SelectedStory.Locations.Contains(topic))
            {
                this.SelectedStory.Locations.Add(topic);
                this.RaisePropertyChanged(() => this.SelectedStory.Locations);
            }
        }
    }

    public void OnAddSubject(Topic topic)
    {
        if (topic != null)
        {
            if (!this.SelectedStory.Subjects.Contains(topic))
            {
                this.SelectedStory.Subjects.Add(topic);
                this.RaisePropertyChanged(() => this.SelectedStory.Subjects);
            }
        }
    }

    private void OnCommandCompleted(string commandType)
    {
        if (commandType == CommandTypes.MetadataEntry)
        {
            this.Initialize();
        }
    }

    private void OnImageResizeCompleted(bool isSuccessful)
    {
        IsImageValid = false;
        if (isSuccessful)
        {

            this.SelectedStory.KeyframeImages = true;
            IsImageValid = true;
        }
        else
        {
            this.SelectedStory.KeyframeImages = false;
            IsImageValid=false;
        }
    }

    private void Initialize()
    {
        this.SelectedStory = new StoryItem();
        this.HeaderInfo = "Create";
    }

    private void LocationSearch(object topicType)
    {
        this.eventAggregator.GetEvent<LocationSearchEvent>().Publish(null);
    }

    private void SubjectSearch(object topicType)
    {
        this.eventAggregator.GetEvent<SubjectSearchEvent>().Publish(null);
    }

    private void RemoveLocation(Topic selected)
    {
        if (selected != null)
        {
            // remove the primary too
            if (this.SelectedStory.PrimaryLocation != null)
            {
                if (string.Equals(this.SelectedStory.PrimaryLocation.FullName, selected.FullName, StringComparison.InvariantCultureIgnoreCase))
                {
                    this.SelectedStory.PrimaryLocation = new Topic();
                }
            }

            bool isSuccessful = this.SelectedStory.Locations.Remove(selected);
            if (isSuccessful)
            {
                this.RaisePropertyChanged(() => this.SelectedStory.Locations);
            }
        }
    }

    private void RemoveSubject(Topic selected)
    {
        if (selected != null)
        {
            // remove the primary too
            if (this.SelectedStory.PrimarySubject != null)
            {
                if (string.Equals(this.SelectedStory.PrimarySubject.FullName, selected.FullName, StringComparison.InvariantCultureIgnoreCase))
                {
                    this.SelectedStory.PrimarySubject = new Topic();
                }
            }

            bool isSuccessful = this.SelectedStory.Subjects.Remove(selected);
            if (isSuccessful)
            {
                this.RaisePropertyChanged(() => this.SelectedStory.Subjects);
            }
        }
    }
}

        private booly _isImageValid;

        public bool IsImageValid
        {
        get
        { 
            return _isImageValid;
        }
        set
        {
            _isImageValid = value;
            this.RaisePropertyChanged(() => this.IsImageValid);
        }
    }
}

正直なところ、ビューがバインディングをどのように理解するのかわかりません。

4

4 に答える 4

4

標準的なアプローチは、ViewModelに「IsImageValid」のようなブールプロパティを設定することです...次に、XAMLで、BooleanToVisibilityConverter http://msdn.microsoft.com/en-を使用して、ラベルのVisibilityプロパティをそのプロパティにバインドします。 us / library / system.windows.controls.booleantovisibilityconverter.aspx

<UserControl.Resources>
  <BooleanToVisibilityConverter
         x:Key="BooleanToVisibilityConverter" />
</UserControl.Resources>
Then use it in one or more bindings like this:

<Label Visibility="{Binding IsImageValid, 
       Converter={StaticResource BooleanToVisibilityConverter}}" 
   ......... />
于 2012-05-08T04:37:50.867 に答える
3

最初にこの投稿を読んでください。

ラベルにテキストを表示したい場合は、次の手順を実行する必要があります。

  • ビューモデルにプロパティを追加します
  • Viewmodel にINotifyPropertyChangedを実装し、プロパティが変更されるたびにイベントを発生させます
  • ビューでDataContextを Viewmodel インスタンスに設定します
  • プロパティへの xamlでBindingを作成します

それで全部です ;)

于 2012-05-08T06:16:45.710 に答える
1

ViewModel から View を見る必要はありません。これは MVVM パターンの背後にある基本原則です。View は VM を認識していますが、VM は View を認識していません。代わりに、@ JeffN825が提案したように行うことができますが、少なくともこれもお勧めします。

于 2012-05-08T05:16:38.657 に答える
-1

以下をユーザー コントロール プロパティに追加します。

xmlns:VM="clr-namespace:<ProjectName>.ViewModels" //this place throws exception,what is <ProjectName> ?

DataContext をユーザー コントロールに割り当てるには、DataContext がまだ割り当てられていない場合は、次のコードを使用します。

<UserControl.DataContext>     //where to add this part ?  
    <VM:MyViewModel>
</UserControl.DataContext>

次の方法で、ラベルの可視性をバインドします。

Visibility="{Binding IsImageValid}"   //this is done

VM の継承元の ViewModel または ViewModelBase は、INotifyPropertyChangedインターフェイスを実装する必要があります。

namespace MyApp.ViewModels           //this i have to do it at xaml.cs file  or suppose to be in viewmodel ?
{
    public class MyViewModel : INotifyPropertyChanged
    {...
     ...
    }
}

次のように、VM でデータ メンバーとプロパティを宣言します。

private System.Windows.Visibility _isImageValid; //add this code in my viewmodel

public System.Windows.Visibility IsImageValid
{
    get
    { 
        return _isImageValid;
    }
    set
    {
        _isImageValid = value;
        this.RaisePropertyChanged(() => this.IsImageValid);
    }
}
于 2012-05-08T06:44:57.553 に答える