0

2 番目のビュー モデルから txtMessage にバインドされたテキストを取得するにはどうすればよいですか? ビュー モデルが 1 つしかないときは、テキストは正常に機能していました。実際のダウンロード コードを 2 番目のビュー モデルに移動すると、機能しなくなりました。何か不足していますか?どんな助けでも感謝します。

Xaml:

<DockPanel DockPanel.Dock="Top">
    <TextBlock x:Name="txtMessage" DockPanel.Dock="Top" Margin="5" Text="{Binding viewModel1.Message}" />
    <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="5,5">
    <ProgressBar Width="300" Visibility="{Binding IsDownloading, Converter={converter:VisibilityConverter}}" IsIndeterminate="True" />
<Button Content="Cancel" />
</StackPanel>
</DockPanel>
<Button Content="Download" Width="120" Margin="0,0,5,0" Name="btnSubmit" Click="btnSubmit_Click" />

分離コード:

public partial class DownloadWindow: Window
    {
        DownloadWindowViewModel viewModel = new DownloadWindowViewModel();

        public DownloadWindow()
        {
            InitializeComponent();
            this.DataContext = viewModel;
        }

        private void btnSubmit_Click(object sender, RoutedEventArgs e)
        {
            viewModel.IsDownloading = true;
            viewModel.Download();

        }

    }

ビューモデル:

public class DownloadWindowViewModel: INotifyPropertyChanged
    {

        Thread downloadThread;
        public DownloadViewModel viewModel1;

        public DownloadWindowViewModel()
        {
            viewModel1 = new DownloadViewModel();
        }

        private bool _isDownloading; = false;

        public bool IsDownloading
        {
            get 
            { 
                return _isDownloading; 
            }
            set 
            { 
                _isDownloading; = value;
                OnPropertyChanged("IsDownloading");
            }
        }

        public void Download()
        {
            viewModel1.Download();

        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }


    }

ビューモデル 1:

public class DownloadViewModel: INotifyPropertyChanged
    {
        Thread _thread;

        public void Download()
        {
            ThreadStart threadStart = delegate()
            {
                StartDownload();
            };
            _thread = new Thread(threadStart);
            _thread.IsBackground = true;
            _thread.Start();

        }

        private void StartDownload()
        {
            for (int i = 10; i < 1500; i++)
            {
                Thread.Sleep(5000);
                Message = "Downloading " + i.ToString();
            }
        }

        private string _message = "";

        public string Message
        {
            get
            {
                return _message;
            }
            set
            {
                if (_message != value)
                {
                    _message = value;
                    OnPropertyChanged("Message");
                }

            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

    }
4

1 に答える 1

2

あなたviewModel1はプロパティでなければならず、現時点ではフィールドです。次のように変更します。

public DownloadViewModel viewModel1 { get; set; }

このような制限が存在する理由の説明は、ここにあります (主に、通知/検証メカニズムが単にフィールドに対して機能しないため):

于 2012-10-15T20:22:53.873 に答える